Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ LoadString、静态库和可执行文件_C++_Visual Studio_Localization_Resources - Fatal编程技术网

C++ LoadString、静态库和可执行文件

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

我的项目是这样设置的,所有的框架代码和模块都被编译成一个静态的.lib(我们称之为
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

  • 在库中获取字符串时,使用
    MyLoadString(framework\u res,framework\u res\u size,iStringId,sz,256)
    而不是LoadString

这样做的一个好处是,当我编写自己的LoadString时,我可以返回指向资源字符串的指针,而不是复制它。我的实际LoadString函数如下所示

LPCWSTR MyFindString(framework_res,framework_res_size,iStringId)


如果使用/n选项编译.rc文件,它将以null结束所有字符串

集中资源的明显方法是创建一个包含资源的DLL。然后,您可以使用
LoadString
,就像资源在可执行文件中一样,除了需要指定正确的模块句柄而不是NULL的次要细节。

+1。不要忘记将
GetModuleHandle(NULL)
更改为针对Dll的正确调用。