VC读取EXE文件的图标并保存

来源:互联网 发布:网络空间 概念股 编辑:程序博客网 时间:2024/05/21 06:23

        在网上搜索保存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);


是不是很简单呀。