【问题标题】:C/C++ Library for Extracting Icons from Binaries用于从二进制文件中提取图标的 C/C++ 库
【发布时间】:2011-09-21 11:45:12
【问题描述】:

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

【问题讨论】:

  • 一个可执行文件可以包含许多图标 - 您特别想要 Windows 显示在“开始”菜单或资源管理器中的图标,对吗?

标签: c++ windows icons shortcuts binaries


【解决方案1】:

【讨论】:

  • 我不是这方面的专家,但ExtractIcon 函数看起来也可能是一个很好的检查函数。
  • 不错!这看起来正是我需要的。我假设我需要的图标的索引为 0 对吗?
【解决方案2】:

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

好吧,如果你不想使用封闭源代码的应用程序,这里有一些源代码, Icon Extractor

【讨论】:

  • 有趣。我宁愿不使用它,因为我必须依赖外部程序和其他人的封闭源代码,但我认为如果我找不到其他任何东西,它会作为最后的手段。感谢您的建议!
【解决方案3】:
  1. LoadLibraryEx - 使用 LOAD_LIBRARY_AS_DATAFILELOAD_LIBRARY_AS_IMAGE_RESOURCE
  2. EnumResourceNames - 寻找资源
  3. LoadImage/LoadIcon - 加载图片/图标

【讨论】:

    【解决方案4】:

    您可能会发现这篇文章很有用:http://www.codeproject.com/KB/shell/shellicon.aspx

    【讨论】:

      【解决方案5】:

      ExtractIconEx。完整的源代码在我的open source project,文件名为 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-26
        • 1970-01-01
        • 2010-09-30
        • 1970-01-01
        • 2021-09-07
        • 2011-05-16
        • 1970-01-01
        • 2011-02-03
        • 2011-05-08
        相关资源
        最近更新 更多