如何在静态库 (Visual Studio) 中嵌入图标 (.ico)
Posted
技术标签:
【中文标题】如何在静态库 (Visual Studio) 中嵌入图标 (.ico)【英文标题】:How to embed an icon (.ico) in a static library (Visual Studio) 【发布时间】: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 项目。 【参考方案1】:我发布答案是因为经过一些研究,我找到了一种方法。使用我的方法,图标可以用作静态库的组成部分,并且此类库可以被任何类型的应用程序使用)。 另见:https://www.codeproject.com/Articles/1275122/How-to-embed-resources-in-a-Static-Library
-
图标被转换为 BYTE 的静态数组。 bin2c 可以用于此。
数据被转换为 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;
使用 GetIcon 代替 LoadIcon。 而不是调用:
m_hIcon = ::LoadIcon(hInstanceIcon, MAKEINTRESOURCE(pXMB->nIcon));
我打电话
m_hIcon = GetIcon()
【讨论】:
错误分析:控制台应用程序是PE图像,就像GUI应用程序一样。任何 PE 映像都可以存储任意部分,包括资源部分,并且大多数控制台应用程序确实包含资源部分(例如,存储版本信息的地方)。不能将资源编译成静态库的真正原因是工具链不支持。 这不是分析!这是一个实际可行的答案,因为它基于真正的程序员编写的真实代码。这个问题是一个真正的问题,它导致了我的问题中描述的问题。然后,在我们的团队设法找到解决方案并确保它有效之后,我发布了答案。在放置此类 cmets 之前,请花点时间实际测试代码。在静态库中嵌入图标很棘手,有些人说这是不可能的。我设法解决了这个问题,并公布了为这个社区的利益而采取的所有步骤。 我在评论第一段,在那里您得出结论,将资源嵌入静态库是不可能的,因为该库可以链接到控制台应用程序,而控制台应用程序(大概)不能资源。这是错误的。除了子系统标头条目之外,控制台应用程序没有任何特殊之处。它们可以(并且通常确实)包含资源。这不是你不能在静态库中嵌入资源的原因。 好的。你是对的。我修改了我的答案。控制台应用程序可以拥有资源。然而,正如你所说的那样,这不是它(几乎)不可能在静态库中嵌入资源的原因,我在找到方法后发布了这个答案......以上是关于如何在静态库 (Visual Studio) 中嵌入图标 (.ico)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 中静态链接 FreeType2?
如何更改静态链接库中 const 字符串数组的 Visual Studio C++ 初始化序列
我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?
如何使用 gcc 和 Visual Studio 的“静态链接”和“动态链接”构建 C/C++ 程序?