C++ LoadString、静态库和可执行文件
我的项目是这样设置的,所有的框架代码和模块都被编译成一个静态的.lib(我们称之为C++ LoadString、静态库和可执行文件,c++,visual-studio,localization,resources,C++,Visual Studio,Localization,Resources,我的项目是这样设置的,所有的框架代码和模块都被编译成一个静态的.lib(我们称之为framework.lib),许多测试项目使用framework.lib并编译成可执行文件 对于错误处理,我尝试将资源字符串放入framework.rc(framework.lib项目的一部分)并将字符串加载到可执行文件中。但是,LoadString()只是失败了。使用GetLastError()/FormatMessage()我得到以下消息: “在映像文件中找不到指定的资源类型。” 下面是我如何调用LoadStr
framework.lib
),许多测试项目使用framework.lib并编译成可执行文件
对于错误处理,我尝试将资源字符串放入framework.rc
(framework.lib
项目的一部分)并将字符串加载到可执行文件中。但是,LoadString()
只是失败了。使用GetLastError()
/FormatMessage()
我得到以下消息:
“在映像文件中找不到指定的资源类型。”
下面是我如何调用LoadString
,它返回0:
char szString[256];
int iNbOfChars = LoadStringA(GetModuleHandle(NULL), iStringID, szString, 256);
我所做的应该失败吗,因为资源不是在应用程序中定义的,而是在库中定义的?如果是,有什么建议可以让我拥有一个集中的资源文件吗?您可以在应用程序的资源文件中使用#include
指令来包含库的资源文件
资源只允许在输出(EXE)级别使用,不能嵌入到.Lib中。AFAIK您不能将资源添加到静态库中-您必须将它们编译到DLL中以共享,或者直接添加到应用程序中
您可以从一个中心位置共享.rc并将其编译到应用程序本身。静态库只是.OBJ文件的串联-它们没有资源之类的功能。为此,您需要将资源放入DLL中 您不能将资源放入.lib文件中。(我希望你能)。您必须保留.rc文件,并在链接到lib时将其包含到应用程序的.rc文件中 因此,您必须确保.lib使用的任何资源id都不会被应用程序使用。这是一个混乱的局面,但如果您使用.rc文件作为字符串,则没有更好的解决方案。并坚持使用微软的工具 大约几年前,我对这个限制感到非常失望,于是我开始构建一个工具,将编译后的资源文件(.res)转换成.obj文件,这样我就可以将它包含到我的lib中。当然,当您这样做时,您不能再使用
LoadString
,但事实证明,编写自己的代码来解析大量.res数据并找到字符串并不是那么难。因此,我目前在库中放置字符串的解决方案是
- 创建framework.rc
- 将其编译为framework.res
- 将framework.res转换为包含外部符号的framework.obj
const BYTE framework_res[]代码>
const size\u t framework\u res\u size代码>
- 在库中获取字符串时,使用
而不是LoadStringMyLoadString(framework\u res,framework\u res\u size,iStringId,sz,256)
LPCWSTR MyFindString(framework_res,framework_res_size,iStringId)代码>
如果使用/n选项编译.rc文件,它将以null结束所有字符串 集中资源的明显方法是创建一个包含资源的DLL。然后,您可以使用LoadString
,就像资源在可执行文件中一样,除了需要指定正确的模块句柄而不是NULL的次要细节。+1。不要忘记将GetModuleHandle(NULL)
更改为针对Dll的正确调用。