2010-02-01 79 views
3

我的项目设置,这样所有的框架代码和模块编译到一个静态的.lib(姑且称之为framework.lib),以及许多测试项目中使用framework.lib和编译为可执行文件。加载链,静态库和可执行文件

对于错误处理,我试图将资源字符串放在framework.rcframework.lib项目的一部分)中,并将字符串加载到可执行文件中。但是,LoadString()只是失败。使用GetLastError()/​​我收到以下消息:

“在图像文件中找不到指定的资源类型。”

这是我如何打电话LoadString,它返回0:

char szString[256]; 
int iNbOfChars = LoadStringA(GetModuleHandle(NULL), iStringID, szString, 256); 

应该我做什么是失败,因为资源没有在应用程序中定义,但在lib?如果是这样,任何建议,所以我可以有一个集中的资源文件?

回答

3

静态库都只是.obj文件级联 - 他们没有像资源的功能。为此,您需要将资源放入DLL中。

+1

+1。只要不要忘记将'GetModuleHandle(NULL)'更改为针对您的Dll的正确调用。 – 2010-02-01 19:49:58

0

您可以使用应用程序的资源文件的#include指令包含的lib的资源文件。

资源只被允许在输出端(EXE)水平,并且不能被嵌入到的.lib。

0

AFAIK你不能资源添加到静态库 - 你必须要么它们编译成DLL共享或直接进入应用程序。

您可以从中心位置共享.rc文件并将其编译到应用程序本身。

1

您不能将资源放入.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_t framework_res_size;

  • 使用MyLoadString(framework_res, framework_res_size, iStringId, sz, 256)而不是LoadString在取回字符串时在天秤座RY。做这种方式的

优点之一竟然是,当我写我自己的加载链,我会返回一个指向资源字符串,而不是复制它。所以我的实际LoadString函数看起来像这样。

LPCWSTR MyFindString(framework_res, framework_res_size, iStringId);

如果使用/ n选项编译rc文件,它会终止空所有字符串。

0

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

相关问题