提取图表的代码。有错误。请各位大侠指正一下。
void __fastcall TForm1::Button3Click(TObject *Sender)
{
char sFileSource[MAX_PATH+1] = "D:\\READEREDIT\\Mag.res";
char sFileDesc[MAX_PATH+1] = "D:\\READEREDIT\\iMookPro.exe";
HANDLE hFileSource;
HANDLE hFileDesc; //hFileSource设为只读,hFileDesc设为可写。
hFileSource = CreateFile(sFileSource, GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
hFileDesc = CreateFile(sFileSource, GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
//打开后,大家最常用的莫过于文件映射,这里为方便与直观,我们直接把文件读到一个内存块中。
//先得到长度
DWORD dwSourceSize = ::GetFileSize(hFileSource,NULL);
DWORD dwDescSize = ::GetFileSize(hFileDesc,NULL);
DWORD byte_write=0;
//读取
char *pFileSource =new char[dwSourceSize];
char *pFileDesc =new char[dwDescSize];
::ReadFile(hFileSource,pFileSource,dwSourceSize,&byte_write,0);
::ReadFile(hFileDesc,pFileDesc,dwDescSize,&byte_write,0);
//循环找出.rsrc节
IMAGE_DOS_HEADER *dosHeadA=(IMAGE_DOS_HEADER *)pFileSource; //DOS头
IMAGE_NT_HEADERS *ntHeadA=(IMAGE_NT_HEADERS *)(pFileSource + dosHeadA->e_lfanew); //NT头
IMAGE_SECTION_HEADER *secHeadA=(IMAGE_SECTION_HEADER *)((char *)ntHeadA+ sizeof(IMAGE_NT_HEADERS)); //第一个节的首地址
for(int i=0;i<ntHeadA->FileHeader .NumberOfSections ;i++,secHeadA++)
{
if(strcmp((char *)secHeadA->Name,".rsrc")==0)
{
//找到.rsrc节
break;
}
}
//根据节表,我们就可以找到资源的入口地址。
IMAGE_RESOURCE_DIRECTORY *dirResourceA=(IMAGE_RESOURCE_DIRECTORY *)((char *)pFileSource + secHeadA->PointerToRawData); //得到资源入口
/*
typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY
{
union
{
struct
{
DWORD NameOffset:31;
DWORD NameIsString:1;
};
DWORD Name;
WORD Id;
};
union
{
DWORD OffsetToData; //指向资源的入口址
struct
{
DWORD OffsetToDirectory:31;
DWORD DataIsDirectory:1; //指向下一级目录的相对地址
};
};
}IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
typedef struct _IMAGE_RESOURCE_DATA_ENTRY
{
DWORD OffsetToData;
DWORD Size;
DWORD CodePage;
DWORD Reserved;
}IMAGE_RESOURCE_DATA_ENTRY , *PIMAGE_RESOURCE_DATA_ENTRY;
*/
dirResourceA=(IMAGE_RESOURCE_DIRECTORY *)((char *)pFileSource + secHeadA->PointerToRawData); //根
IMAGE_RESOURCE_DIRECTORY_ENTRY *entryResourceA=(IMAGE_RESOURCE_DIRECTORY_ENTRY *)((DWORD)dirResourceA + sizeof (IMAGE_RESOURCE_DIRECTORY));
IMAGE_RESOURCE_DIRECTORY *dirTemp; //第二层
IMAGE_RESOURCE_DIRECTORY_ENTRY *entryTemp;
IMAGE_RESOURCE_DIRECTORY *dirTempICON; //第三层
IMAGE_RESOURCE_DIRECTORY_ENTRY *entryTempICON;
IMAGE_RESOURCE_DATA_ENTRY *entryData; //资源入口结构
for(int i=0;i<(dirResourceA->NumberOfIdEntries+dirResourceA->NumberOfNamedEntries);i++,entryResourceA++)
{
//所有资源
if(entryResourceA->Name==3)
{
//ICON
dirTemp=(IMAGE_RESOURCE_DIRECTORY *)((char *)dirResourceA+entryResourceA->OffsetToDirectory);
entryTemp=(IMAGE_RESOURCE_DIRECTORY_ENTRY *)((char *)dirTemp+sizeof(IMAGE_RESOURCE_DIRECTORY));
for(int k=0;k<(dirTemp->NumberOfIdEntries+dirTemp->NumberOfNamedEntries);k++,entryTemp++)
{
//子目录
if(entryTemp->DataIsDirectory >0)
{
//还有子目录
dirTempICON=(IMAGE_RESOURCE_DIRECTORY *)((char *)dirResourceA + entryTemp->OffsetToDirectory );
entryTempICON=(IMAGE_RESOURCE_DIRECTORY_ENTRY *)((char *)dirTempICON + sizeof(IMAGE_RESOURCE_DIRECTORY));
entryData=(IMAGE_RESOURCE_DATA_ENTRY *)((char *)dirResourceA + entryTempICON->OffsetToData ); //资源入口结构
break; //得到后跳出
}
}
}
}
DWORD dwIconSize=entryData->Size;
char *pSrcIcon=entryData->OffsetToData - secHeadA->VirtualAddress + (char *)dirResourceA;
char *pSourceIcon= new char[dwIconSize+1];
memcpy(pSourceIcon,pSrcIcon,dwIconSize);
}