提取图表的代码。有错误。请各位大侠指正一下。

iwenlove 2006-05-24 10:49:00
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);

}
...全文
74 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
iwenlove 2006-05-24
  • 打赏
  • 举报
回复
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); //得到资源入口

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 *entryDataA; //资源入口结构
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));
entryDataA=(IMAGE_RESOURCE_DATA_ENTRY *)((char *)dirResourceA + entryTempICON->OffsetToData ); //资源入口结构
break; //得到后跳出
}
}
}
}

DWORD dwIconSize=entryDataA->Size;
char *pSrcIcon=entryDataA->OffsetToData - secHeadA->VirtualAddress + (char *)dirResourceA;
char *pSourceIcon= new char[dwIconSize+1];
memcpy(pSourceIcon,pSrcIcon,dwIconSize);


//循环B找出.rsrc节
IMAGE_DOS_HEADER *dosHeadB=(IMAGE_DOS_HEADER *)pFileDesc; //DOS头
IMAGE_NT_HEADERS *ntHeadB=(IMAGE_NT_HEADERS *)(pFileDesc + dosHeadB->e_lfanew); //NT头
IMAGE_SECTION_HEADER *secHeadB=(IMAGE_SECTION_HEADER *)((char *)ntHeadB+ sizeof(IMAGE_NT_HEADERS)); //第一个节的首地址

for(int i=0;i<ntHeadB->FileHeader.NumberOfSections ;i++,secHeadB++)
{
if(strcmp((char *)secHeadB->Name,".rsrc")==0)
{
//找到.rsrc节
break;
}
}
//根据节表,我们就可以找到资源的入口地址。
IMAGE_RESOURCE_DIRECTORY *dirResourceB=(IMAGE_RESOURCE_DIRECTORY *)((char *)pFileDesc + secHeadB->PointerToRawData); //得到资源入口

dirResourceB=(IMAGE_RESOURCE_DIRECTORY *)((char *)pFileDesc + secHeadB->PointerToRawData); //根
IMAGE_RESOURCE_DIRECTORY_ENTRY *entryResourceB=(IMAGE_RESOURCE_DIRECTORY_ENTRY *)((DWORD)dirResourceB + 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 *entryDataB; //资源入口结构
for(int i=0;i<(dirResourceB->NumberOfIdEntries+dirResourceB->NumberOfNamedEntries);i++,entryResourceB++)
{
//所有资源
if(entryResourceB->Name==3)
{
//ICON
dirTemp=(IMAGE_RESOURCE_DIRECTORY *)((char *)dirResourceB+entryResourceB->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 *)dirResourceB + entryTemp->OffsetToDirectory );
entryTempICON=(IMAGE_RESOURCE_DIRECTORY_ENTRY *)((char *)dirTempICON + sizeof(IMAGE_RESOURCE_DIRECTORY));
entryDataB=(IMAGE_RESOURCE_DATA_ENTRY *)((char *)dirResourceB + entryTempICON->OffsetToData ); //资源入口结构
break; //得到后跳出
}
}
}
}

DWORD dwIconSizeB=entryDataB->Size;
char *pSrcIconB=entryDataB->OffsetToData - secHeadB->VirtualAddress + (char *)dirResourceB;
char *pSourceIconB= new char[dwIconSizeB+1];
memcpy(pSourceIconB,pSrcIconB,dwIconSizeB);

pSourceIconB = pSourceIcon;
iwenlove 2006-05-24
  • 打赏
  • 举报
回复
图标

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧