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

esbemjvw  于 2023-04-13  发布在  Windows
关注(0)|答案(5)|浏览(163)

我打算建立一个热键激活的Windows应用程序启动器.我打算为它是一个弹出的图标网格,然后你可以点击并启动你需要的.我想让它自动扫描开始菜单和桌面的程序快捷方式和目录.然而,我不知道如何从快捷方式/实际的二进制文件中进行图标检索过程,我想知道是否有任何C/C++库可以处理这类事情?如果不是,我怎么去做呢?

2vuwiymt

2vuwiymt2#

resources extract是一个这样的工具,它从dll/ocx/exe文件中提取图像。
如果您不想使用封闭源代码的应用程序,这里有一个源代码,Icon Extractor

zysjyyx4

zysjyyx43#

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

drkbr07n4#

ExtractIconEx。完整的源代码在我的开源项目中,文件名为icon.cpp。它支持扩展系统变量和从索引中获取图标,如%SYSTEMROOT%\system32\shell32.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;
}
093gszye

093gszye5#

您可以使用ExctractIconEx从可执行文件加载指定的图标。如果需要与shell兼容,此article建议检查HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons注册表中的图标覆盖。

相关问题