2014-10-31 53 views
-2

所以我有一個包含下面的代碼tbl.rc文件一個Win32 DLL:C++ - 加載鏈()內的Win32 DLL不起作用

STRINGTABLE 
BEGIN 
    1 "Hola!" 
END 

而在我的DLLMain,我做這樣的事情

char* strt = new char[5]; 
LoadString(hinstDLL, 1, strt, 5); // "hinstDLL" is a parameter passed by DLLMain, which SHOULD be the HINSTANCE of the DLL 
printf("String is %s", strt); 

然而,我的輸出是總是

String is 

以及i w當然,我想知道爲什麼以及如何解決這個問題。非常感謝你!

+0

嘗試使用谷歌搜索「null終止的字符串」。另外,LoadString的文檔解釋瞭如何確定失敗的原因。 – arx 2014-10-31 11:52:54

+1

「霍拉!」有6個字符,忘記零終結符是一個標準的錯誤。不檢查錯誤是另一個。 – 2014-10-31 12:29:15

+0

即使我把它升到6也不行:/ – xNaXDy 2014-10-31 12:31:50

回答

0

我認爲LoadString()是失敗的(你應該檢查它的返回值和GetLastError())。如果您在DllMain()中調用它,它會失敗。 DllMain()在加載鎖定時被調用,因此對可在DllMain()內調用的函數施加重大限制。

根據MSDN:在User32.dll中或GDI32.DLL
...
•通話功能:

Dynamic-Link Library Best Practices

你不應該從內部的DllMain執行下列任務。某些函數加載另一個DLL,可能無法初始化。

documentation對於LoadString()表明它是一個User32.dll函數。

的方式來解決這個問題:

  1. DllMain()刪除LoadString()電話。

  2. 在您的DLL中有一個函數,它將根據需要加載並返回字符串。

+0

如果我確實創建了另一個函數,我將如何繼續關於傳遞HINSTANCE? – xNaXDy 2014-10-31 12:04:10

+0

最後的錯誤使用printf(「LAST ERROR%X \ n」,GetLastError());'方式打印714。 'printf(「LAST ERROR%X \ n」,LoadString(/ *懶得輸入參數* /));'返回'LAST ERROR 0'。 **注意**這些輸出是在DllMain的**之外運行代碼**時將HINSTANCE存儲在變量中返回的 – xNaXDy 2014-10-31 12:39:25

+1

在dllMain存儲hinstDLL中的全局變量時,當fdwReason是DLL_PROCESS_ATTACH時,請照常使用它。 LoadString返回值0意味着它沒有找到字符串資源。所以檢查.dll文件是否實際包含字符串。 GetLastError()返回什麼? – Begemoth 2014-10-31 14:38:08