C++ 以编程方式更改exe';C+中的s图标+;

C++ 以编程方式更改exe';C+中的s图标+;,c++,winapi,C++,Winapi,我有一个在MFC中创建的应用程序,需要为exe设置几个图标中的一个。在应用程序安装到用户的机器上之前,我不知道该使用哪个图标。我已经关注了几个网站(包括)如何通过编程实现这一点 exe在应用程序的.rc文件中使用的图标是IDR_MAINFRAME(ID 128),它只是一个标准的.ico文件。 运行更新代码后,当我在Visual Studio中打开exe时,我看到IDR_MAINFRAME的图标已更新为正确的图标,但在资源管理器中用于exe的图像仍显示旧的(原始)图标。我在更新的exe中没有看到

我有一个在MFC中创建的应用程序,需要为exe设置几个图标中的一个。在应用程序安装到用户的机器上之前,我不知道该使用哪个图标。我已经关注了几个网站(包括)如何通过编程实现这一点

exe在应用程序的.rc文件中使用的图标是IDR_MAINFRAME(ID 128),它只是一个标准的.ico文件。 运行更新代码后,当我在Visual Studio中打开exe时,我看到IDR_MAINFRAME的图标已更新为正确的图标,但在资源管理器中用于exe的图像仍显示旧的(原始)图标。我在更新的exe中没有看到对原始图标的任何引用

我错过了什么

HGLOBAL hResLoad;   // handle to loaded resource
HMODULE hExe;       // handle to existing .EXE file
HRSRC hRes;         // handle/ptr. to res. info. in hExe
HANDLE hUpdateRes;  // update resource handle
LPVOID lpResLock;   // pointer to resource data
BOOL result;

hExe = LoadLibrary(TEXT("app.exe"));
if (hExe == NULL)
{
  return;
}

// Locate the icon resource in the .EXE file.
hRes = FindResource(hExe, MAKEINTRESOURCE(IDI_TB_SAVE), RT_GROUP_ICON);
if (hRes == NULL)
{
  return;
}

// Load the resource into global memory.
hResLoad = LoadResource(hExe, hRes);
if (hResLoad == NULL)
{
  return;
}

// Lock the resourcex into global memory.
lpResLock = LockResource(hResLoad);
if (lpResLock == NULL)
{
  return;
}
 
// Open the file to which you want to add the icon resource.
hUpdateRes = BeginUpdateResource(TEXT("app_updated.exe"), FALSE);
if (hUpdateRes == NULL)
{
  return;
}

result = UpdateResource(hUpdateRes,    // update resource handle
  RT_GROUP_ICON,                         // change icon resource
  MAKEINTRESOURCE(IDR_MAINFRAME),         // resource id
  MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),  // english
  lpResLock,                         // ptr to resource info
  SizeofResource(hExe, hRes));       // size of resource info

if (result == FALSE)
{
  return;
}

// Write changes to app_updated.exe and then close it.
if (!EndUpdateResource(hUpdateRes, FALSE))
{
  return;
}

// Clean up.
if (!FreeLibrary(hExe))
{
  return;
}

按照@RichardCritten的建议,我刷新了图标缓存(刚刚重新启动explorer.exe),更新后的图标显示正确。代码是正确的。

Explorer会将图标缓存一段时间。否则,打开一个包含大量可执行文件的文件夹(它必须读取和解析每个文件)会太慢。试试@RichardCritten是的,这是一个缓存问题。谢谢这是一个难得的机会,可以对一个结构合理、措辞恰当、范围明确的问题进行投票。