【问题标题】:How to embed an icon (.ico) in a static library (Visual Studio)如何在静态库 (Visual Studio) 中嵌入图标 (.ico)
【发布时间】:2017-03-30 12:40:53
【问题描述】:

有没有办法在 c++ (Win32 API) 静态库中嵌入资源(例如图标、对话框)? 我的目的是在静态库中嵌入一个图标,使使用 LoadIcon 的函数可以像普通 .exe 一样工作,因此主应用程序只能链接到静态库并包含头文件,而无需添加其他文件,例如 .rc 文件或 .ico 文件等。 显然,使用静态库的主应用程序没有此资源,因此 LoadIcon 将失败,但我想知道是否有解决方法使其工作。只要标准 API 调用(例如 LoadIcon)可以工作,包含图标数据的静态数组就可以工作。

为了进一步解释,将使用静态库的人将只有 2 个文件:.lib 和 .h,并且不会有任何 .rc 文件。

【问题讨论】:

  • @Michale:你试过了吗?我认为它应该有效。
  • 试过什么?你没有包含任何链接
  • 您的代码中没有包含minimal reproducible example
  • 我认为我不必这样做,因为这是一个普遍的问题
  • 不可能,你可以别找了。请考虑使用 DLL 项目。

标签: c++ c visual-studio-2012 visual-studio-2013 resources


【解决方案1】:

我发布答案是因为经过一些研究,我找到了一种方法。使用我的方法,图标可以用作静态库的组成部分,并且此类库可以被任何类型的应用程序使用)。 另见:https://www.codeproject.com/Articles/1275122/How-to-embed-resources-in-a-Static-Library

  1. 图标被转换为 BYTE 的静态数组。 bin2c 可以用于此。
  2. 数据被转换为 HICON 句柄。以下是我的做法:

    HICON GetIcon()
    { 
       DWORD dwTmp;
       int offset;
       HANDLE hFile;
       HICON hIcon = NULL;
       offset = LookupIconIdFromDirectoryEx(s_byIconData, TRUE, 0, 0, LR_DEFAULTCOLOR);
       if (offset != 0)
       {
          hIcon = CreateIconFromResourceEx(s_byIconData + offset, 0, TRUE, 0x00030000, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
       }
       return hIcon;  
    }
    
  3. 使用 GetIcon 代替 LoadIcon。 而不是调用:

m_hIcon = ::LoadIcon(hInstanceIcon, MAKEINTRESOURCE(pXMB->nIcon));

我打电话

m_hIcon = GetIcon()

【讨论】:

  • 错误分析:控制台应用程序是PE图像,就像GUI应用程序一样。任何 PE 映像都可以存储任意部分,包括资源部分,并且大多数控制台应用程序确实包含资源部分(例如,存储版本信息的地方)。不能将资源编译成静态库的真正原因是工具链不支持。
  • 这不是分析!这是一个实际可行的答案,因为它基于真正的程序员编写的真实代码。这个问题是一个真正的问题,它导致了我的问题中描述的问题。然后,在我们的团队设法找到解决方案并确保它有效之后,我发布了答案。在放置此类 cmets 之前,请花点时间实际测试代码。在静态库中嵌入图标很棘手,有些人说这是不可能的。我设法解决了这个问题,并公布了为这个社区的利益而采取的所有步骤。
  • 我在评论第一段,在那里您得出结论,将资源嵌入静态库是不可能的,因为该库可以链接到控制台应用程序,而控制台应用程序(大概)不能资源。这是错误的。除了子系统标头条目之外,控制台应用程序没有任何特殊之处。它们可以(并且通常确实)包含资源。这不是你不能在静态库中嵌入资源的原因。
  • 好的。你是对的。我修改了我的答案。控制台应用程序可以拥有资源。然而,正如你所说的那样,这不是它(几乎)不可能在静态库中嵌入资源的原因,我在找到方法后发布了这个答案......
猜你喜欢
  • 2017-08-15
  • 2014-04-02
  • 1970-01-01
  • 2011-02-28
  • 2011-06-15
  • 2012-05-21
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多