用eXeScope打开看原来的是:
资源
  图标
   MAINICON
     1: 32*32,16色     对应DELPHI默认图标换完后变成:
资源
  图标
   MAINICON
     1: 32*32,16色      显示语言中性 中文(中国)
         语言中性       对应换了后的图标
         中文(中国)   对应DELPHI默认图标
        
真是见了鬼了。但是确实是换了,可以显示新图标。代码如下:
因为DELPHI的TICON类有问题,同样的代码老是着色失真,所以用VC写的换图标的程序(DELPHI版的换了也是上面的情况,只是图标着色失真)
int    TestC(char SFileName[],char DFileName[])   
{     HINSTANCE hInstance=LoadLibrary(SFileName);//载入图标源文件 

 DWORD maxSize=0;
    HRSRC hRsrc =NULL;
 DWORD resourcelen=0;
 int idx=1;
 int maxidx=1;
    LPVOID lpRes =0;
 HANDLE hUpdateRes =0;
 while(true)
 {//讀取最大的圖片
  hRsrc=FindResource(hInstance,(LPCSTR)idx,(LPCSTR)RT_ICON); //查找源文件中的图标文件
  resourcelen=SizeofResource(hInstance,hRsrc);
  if(resourcelen<=0)
  {
   break;
  }
  if(resourcelen>maxSize)
  {
   maxSize=resourcelen;
   maxidx=idx;
  }
  idx++;
 }
 hRsrc=FindResource(hInstance,(LPCSTR)maxidx,(LPCSTR)RT_ICON); //查找源文件中的图标文件
 resourcelen=SizeofResource(hInstance,hRsrc);
 lpRes =LockResource(LoadResource(hInstance,hRsrc)); //锁定资源
 if (!lpRes)
 {
  return 0;
 }
 
    hUpdateRes = BeginUpdateResource(DFileName, FALSE); //更新dd2文件图标为dd的 
if(!hUpdateRes)
    {
return 0;
}
    //更新图标资源
if(!UpdateResource(hUpdateRes,(LPCSTR)RT_ICON, (LPCSTR)1,0,lpRes,resourcelen))
    {
return 0;
}
     //结束更新资源
    if(!EndUpdateResource(hUpdateRes,FALSE))
    {
return 0;
}    
    FreeResource(hRsrc); //关闭句柄
    FreeResource(hUpdateRes);//关闭句柄
    //释放载入的源文件
    if(!FreeLibrary(hInstance))
    {
return 0;
}
return 1;
    
  }  

解决方案 »

  1.   

    以下是DELPHI的代码,改出来也是一个样子。高手指点
    type
    PICONDIRENTRY = ^ICONDIRENTRY;
    ICONDIRENTRY = packed record
        bWidth: Byte;
        bHeight: Byte;
        bColorCount: Byte;
        bReserved: Byte;
        wPlanes: Word;
        wBitCount: Word;
        dwBytesInRes: DWORD;
        dwImageOffset: DWORD;
    end;PICONDIR = ^ICONDIR;
    ICONDIR = packed record
        idReserved: Word;
        idType: Word;
        idCount: Word;
        idEntries: ICONDIRENTRY;
    end;PGRPICONDIRENTRY = ^GRPICONDIRENTRY;
    GRPICONDIRENTRY = packed record
        bWidth: Byte;
        bHeight: Byte;
        bColorCount: Byte;
        bReserved: Byte;
        wPlanes: Word;
        wBitCount: Word;
        dwBytesInRes: DWORD;
        nID: Word;
    end;PGRPICONDIR = ^GRPICONDIR;
    GRPICONDIR = packed record
        idReserved: Word;
        idType: Word;
        idCount: Word;
        idEntries: GRPICONDIRENTRY; 
    end; 
    //////////////////////////////////////////////
    //函数说明:修改EXE图标
    //
    //参    数:IconFile 图标文件 
    //              ExeFile 被修改的EXE文件
    //
    //返回值: 成功为True,否则False
    /////////////////////////////////////////////
    function ChangeExeIcon(IcoFile, ExeFile: string): Boolean;
    var
    stID: ICONDIR;
    stGID: GRPICONDIR;pGrpIcon: PBYTE;
    pIcon: PBYTE;
    hUpdate: DWORD;
    nSize, nGSize: DWORD; 
    hFile: THandle;
    dwReserved: DWORD; 
    ret: Boolean;
    begin
    Result := False;hFile := CreateFile(PChar(IcoFile), GENERIC_READ, 0, nil, OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL, 0);
    if hFile = INVALID_HANDLE_VALUE then
        Exit;try                      
        ReadFile(hFile, stID, Sizeof(ICONDIR), dwReserved, nil);    nSize := stID.idEntries.dwBytesInRes;
        GetMem(pIcon, nSize);
        SetFilePointer(hFile, stID.idEntries.dwImageOffset, nil, FILE_BEGIN);
        ReadFile(hFile, pIcon^, nSize, dwReserved, nil);    stGID.idType := 1;
        stGID.idCount := stID.idCount;
        stGID.idReserved := 0;
        CopyMemory(@stGID.idEntries.bWidth, @stID.idEntries.bWidth, 12);
        stGID.idEntries.nID := 0;    nGSize := Sizeof(GRPICONDIR);
        GetMem(pGrpIcon, nGSize);
        CopyMemory(pGrpIcon, @stGID, nGSize);    hUpdate := BeginUpdateResource(PChar(ExeFile), False);
        try
          ret := UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, pGrpIcon, nGSize);
          ret := UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(1), 0, pIcon, nSize);
        finally
          EndUpdateResource(hUpdate, False);
        end;
    finally
        CloseHandle(hFile);
    end;Result := ret;
    end;
      

  2.   

    UpdateResource的时候可以指定语言的,看看他的帮助