2014-01-27 90 views
0

我正試圖從我的Strin Table中加載一個字符串來處理我正在處理的DLL文件。這是應該加載字符串到std::wstring函數(因爲我的項目使用Unicode字符集)。LoadString()方法在C++中不起作用

void ErrorHandler::load_error_string() 
{ 
    m_hInst = AfxGetInstanceHandle(); 
    wchar_t buffer[1024] = { '\0' }; 
    std::size_t string_length = LoadStringW(this->m_hInst, this->m_error_id, buffer, 1024); 

    this->m_raw_content = std::wstring(buffer, string_length); 

    CStringW output; 
    output.Format(L"%d", m_raw_content.length()); 

    AfxMessageBox(output); 
} 

我創建了最後三行診斷方法。 AfxMessageBox()的輸出是0

我在哪裏錯了?

+0

請記住,'string_length'可以表示'std :: wstring'的大小,而'std :: wstring'具有'wchar_t',對於實例2字節可以是'wchar_t'。所以有一個機會,你必須做一個'字節轉換'...像m_raw_content.length()* sizeof(wchar_t),當然取決於你的'output.Format'實現。 –

+0

'output'變量僅用於診斷。我已經寫了,因爲這種方法不起作用。 – Victor

+0

字符串資源是否嵌入在DLL中? – benjymous

回答

2

AfxGetInstanceHandle()爲您提供運行可執行文件HINSTANCE。這意味着您的LoadStringW調用將在exe的資源表中查找您的字符串,這將失敗,因爲字符串在您的DLL中。

相反,你需要抓住DLL本身HINSTANCE - 這是在您的DLL提供作爲第一個參數DllMain()https://stackoverflow.com/a/2396380/1073843

編輯

爲例看到這個答案 如果您使用的是MFC DLL,那麼可能你只需要一個電話在任何入口點的頂部添加到AFX_MANAGE_STATE(AfxGetStaticModuleState()); (在調用AfxGetInstanceHandle()之前)。

+0

我沒有任何DLLMain在我的項目:)) – Victor

+0

你應該可以只添加一個 - 看到我鏈接 – benjymous

+0

我的DLL是一個MFC DLL的帖子 – Victor

0

看一看this question,它會告訴你如何獲得DLL的HINSTANCE,如果它是MFC DLL。