2010-02-01 83 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的小細節外。

相關問題