对一个现存的exe文件,如何将一个.ico文件设置为其图标,即在磁盘上显示的图标。我用UpdateResoure的方法,无法更新成功
DWORD dwBytesRead;
HANDLE hFile = NULL;
HANDLE hUpdate;
int ret = 0; hFile = CreateFile(lpszIcon, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); dwBytesRead = GetFileSize(hFile, NULL); LPVOID pBuff = malloc(dwBytesRead);
DWORD dwRet; ReadFile(hFile, pBuff, dwBytesRead, &dwRet, NULL); hUpdate = BeginUpdateResource(lspzExeFile, false);
    ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(5), 0, (LPVOID)pBuff, dwRet);
    EndUpdateResource(hUpdate, false); free(pBuff);
是不是UpdateResoure的pBuff内容不应该用上述ReadFile的方法获取?

解决方案 »

  1.   

    1,最简单的就是把自定义的ICO文件copy到RES文件夹下面,替换掉以工程名命名的ICO文件,重新打开工程REBUILD就可以了 
    2,还可以在资源视图里面,找到ICON中的IDR_MAINFRAME,跟画图板似的,自己画或者从另外的ICO拷贝过来
    也可以代码实现HICON   m_hIcon; 
    m_hIcon   =   AfxGetApp()-> LoadIcon(IDR_MAINFRAME); 
    SetIcon(m_hIcon,   TRUE); //   Set   big   icon 
    SetIcon(m_hIcon,   FALSE); //   Set   small   icon 
    ondraw或者OnPaint()   中 
    if   (IsIconic()) 

    CPaintDC   dc(this);   //   device   context   for   painting SendMessage(WM_ICONERASEBKGND,   (WPARAM)   dc.GetSafeHdc(),   0); //   Center   icon   in   client   rectangle 
    int   cxIcon   =   GetSystemMetrics(SM_CXICON); 
    int   cyIcon   =   GetSystemMetrics(SM_CYICON); 
    CRect   rect; 
    GetClientRect(&rect); 
    int   x   =   (rect.Width()   -   cxIcon   +   1)   /   2; 
    int   y   =   (rect.Height()   -   cyIcon   +   1)   /   2; //   Draw   the   icon 
    dc.DrawIcon(x,   y,   m_hIcon); 
    }
      

  2.   

    告诉你个巨简单的方法:
      在VC6中导入ICON资源,然后在Resource.h中把资源的ID值改为小于128,一般127,重新编译即可
    #define IDI_ICON1    127
    不信可以试试。但这种方法自改变在磁盘上显示EXE的图标,貌似符合你的要求
      

  3.   


    你误解楼主的意思了,人家是直接修改exe,不是改源代码,有源代码谁不会替换图标?不知道楼主研究过PE文件结构没有?根据PE结构找到PE资源区里的图标,获取图标的大小和内容偏移,替换之
      

  4.   

    http://blog.csdn.net/qq752923276/article/details/6243882
      

  5.   

    MSDN里有示例代码,但是不全。搜一下ICONDIRENTRY就可以找到。
    以下是我自己实现的。
    http://blog.csdn.net/dyzhen/article/details/6784426