用于从二进制文件中提取图标的C/C++库

C/C++ Library for Extracting Icons from Binaries

本文关键字:C++ 图标 二进制文件 提取 用于      更新时间:2023-10-16

我正计划为Windows构建一个热键激活的应用程序启动器。我打算让它成为一个弹出的图标网格,然后你可以点击并启动你需要的东西。我希望它能自动扫描"开始"菜单和"桌面"中的程序快捷方式并对其进行编目。然而,我不知道如何从快捷方式/实际的二进制文件中进行图标检索过程,我想知道是否有任何C/C++库可以处理这类事情?如果没有,否则我该怎么办?

我认为您想要使用ExtractAssociatedIcon

请参阅http://msdn.microsoft.com/en-us/library/ms648067%28v=VS.85%29.aspx

resources extract就是这样一个工具,它从dll/ocx/exe文件中提取图像。

好吧,如果你不想使用一个封闭的源代码应用程序,这里有一些源代码,图标提取器

  1. LoadLibraryEx-使用LOAD_LIBRARY_AS_DATAFILELOAD_LIBRARY_AS_IMAGE_RESOURCE
  2. EnumResourceNames-查找资源
  3. LoadImage/LoadIcon-加载图像/图标

ExtractIconEx。完整的源代码在我的开源项目中,文件名为icon.cpp。它支持系统变量的扩展和从索引中获取图标,如%SYSTEMROOT%system32shell32.dll,43

以下是它的核心:

HICON GoFindAnIcon(LPCTSTR path)
{
    HICON icon = 0;
    //not using our parent's icon
    if(_tcsicmp(L"parent", path))
    {
        icon = (HICON)LoadImage(0, path, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_LOADFROMFILE|LR_LOADMAP3DCOLORS);
        if(!icon)
        {
            //Try something else
            TCHAR mypath[MAX_PATH];
            const TCHAR *cleanpath = path;
            const TCHAR *comma;             
            comma = _tcsrchr(path, ',');
            UINT index = 1;
            if(comma)
            {
                _tcsncpy(mypath, path, comma-path); //Can you exploit this buffer overflow ?
                mypath[comma-path] = TCHAR(0);
                index = _ttoi(comma+1);
                cleanpath = mypath;
            }
            ExtractIconEx(cleanpath, index, 0, &icon, 1);
        }
    }
    else
    {
        icon = GetParentProcessIcon();
    }
    return icon;
}

您可以使用ExcractIconEx从可执行文件加载指定的图标。如果希望与shell兼容,本文建议在HKLMSOFTWAREMicrosoftWindowsCurrentVersionExplorerShell Icons的注册表中检查图标覆盖。