2010-07-28 67 views
1

我需要加載一個字符串放置在不同進程的資源dll中,前提是進程將在調用時運行。如何從不同進程的資源加載字符串?

我嘗試下面的代碼 -

HMODULE hRes = ::LoadLibrary(_T("SomeResource.dll")); 

    TCHAR buffer[50]; 
    ::LoadString(hRes, IDS_SOME_ID, buffer, 50); 

此代碼工作正常在調試模式下運行時。 但在發佈模式下,LoadLibrary返回零。爲什麼?

我錯過了什麼嗎?請幫幫我。

我正在使用VC7.1編譯器。

+0

GetLastError()是什麼意思?也許SomeResource.dll沒有編譯/部署在Release目錄中。 – pascal 2010-07-28 07:35:34

+1

是SomeResource.dll是在發佈目錄(或您運行您的發佈exe文件相同的目錄)? – Naveen 2010-07-28 07:37:07

+0

是的,發現了問題。 SomeResource.dll是在一個不同的目錄,比發佈exe文件...使用FullPath的DLL和...它的作品。 感謝每一個人的快速幫助。 :) – Hemant 2010-07-28 08:36:10

回答

1

這可能是找到"SomeResource.dll"問題。從調試器運行時,可執行文件將從項目路徑啓動。如果可以從那裏找到DLL。沒關係。當您從IDE外部運行時,可執行文件將從其他文件夾啓動。很可能是從那裏找不到DLL。

0

我不是假裝的答案,但可以請加下面的代碼來診斷問題:

if(hRes == 0){ 
LPVOID lpMsgBuf; 
DWORD dw = GetLastError(); 

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM, 
    NULL, 
    dw, 
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
    (LPTSTR) &lpMsgBuf, 
    0, NULL); 


MessageBox(NULL, (LPTSTR)lpMsgBuf, "Error", MB_OK); 

LocalFree(lpMsgBuf); 
} 
+0

'szBuf'未被使用。 – pascal 2010-07-28 07:39:06

+0

爲什麼'lpMsgBuf'只是'LPVOID'只是爲了在你使用它的地方將它轉換爲'LPTSTR'?爲什麼不從一開始就讓它成爲'LPTSTR'? – sbi 2010-07-28 07:40:11

+0

@pascal - 謝謝,剛剛刪除 – Dewfy 2010-07-28 07:59:26