在网上搜索保存EXE文件图标的方法,找到许多文章,一大堆代码,10几个函数,一堆结构及定义,看着都头大。复制下来后,编译出错,少这个少那个的,捣鼓了半天时间都没搞好,终于放弃了。 就保存个图片,真有那么复杂吗!功夫不负有心人,终于找到了简单的方法,与大家分享下。
相关的结构还是要的:
/******************************************************************************/
// 结构(图标相关)
/******************************************************************************/
struct ICONDIRENTRY
{
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwBytesInRes;
DWORD dwImageOffset;
};
struct ICONDIR
{
WORD idReserved;
WORD idType;
WORD idCount;
//ICONDIRENTRY idEntries;
};
struct GRPICONDIRENTRY
{
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwBytesInRes;
WORD nID;
};
struct GRPICONDIR
{
WORD idReserved;
WORD idType;
WORD idCount;
GRPICONDIRENTRY idEntries;
};
就一个函数,是根据ICON句柄保存图标为文件,参数就不解释了。
//*****************************************************************************
//保存ICON图标
//*****************************************************************************
void SaveIcon(HICON hIcon, LPCTSTR szFilePath)
{
PICTDESC picdesc;
picdesc.cbSizeofstruct = sizeof(PICTDESC);
picdesc.picType = PICTYPE_ICON;
picdesc.icon.hicon = hIcon;
IPicture *pPicture=NULL;
LPSTREAM pStream;
LONG size;
char pathbuf[1024];
CFile iconfile;
OleCreatePictureIndirect(&picdesc, IID_IPicture, TRUE, (VOID**)&pPicture);
CreateStreamOnHGlobal(NULL, TRUE, &pStream);
HRESULT hr=pPicture->SaveAsFile(pStream, TRUE, &size);
strcpy(pathbuf, szFilePath);
iconfile.Open(pathbuf, CFile::modeCreate|CFile::modeWrite);
LARGE_INTEGER li;
li.HighPart=0;
li.LowPart=0;
ULARGE_INTEGER ulnewpos;
pStream->Seek(li, STREAM_SEEK_SET, &ulnewpos);
ULONG uReadCount = 1;
while(uReadCount>0)
{
pStream->Read(pathbuf, sizeof(pathbuf), &uReadCount);
if(uReadCount>0) iconfile.Write(pathbuf, uReadCount);
}
pStream->Release();
iconfile.Close();
}
以上好象没提到EXE文件呀,文不对题?非也,因为这个太简单了,API函数已经有了,不值得专门做个函数。
WINSHELLAPI HICON APIENTRY ExtractIconA(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex);
用法:
HICON hIcon=NULL;
hIcon = ExtractIcon(AfxGetInstanceHandle(), “c:\\test.exe”, 0); //获取图标,第二个参数为要获取第几个图标
SaveIcon(hIcon, "c:\\test.ico");
要知道EXE文件中有几个图标:
WINSHELLAPI UINT WINAPI ExtractIconExA(LPCSTR lpszFile, int nIconIndex, HICON FAR *phiconLarge, HICON FAR *phiconSmall, UINT nIcons);
UINT nIconCnt = ExtractIconEx("c:\\test.exe", -1, NULL, NULL, 0);
是不是很简单呀。