2013-07-30 33 views
0

大家好。 我必須使用舊的工具:它將xls轉換爲txt。 在實用程序的邏輯中存在一個小問題,但問題在於其他事情... 該實用程序由兩部分組成:exe模塊和dll模塊,並使用MFC。函數在dll中沒有收到CString參數值

在EXE項目,我們有

pInit = (t_bXR_Init)GetProcAddress(hExcel, _T("bXR_Init"));

pInit("logfiles",false);

在DLL項目,我們有

typedef bool (*t_bXR_Init) (CString const &strlogfilespath, bool btxtfile); XLSREADER_API bool bXR_Init(CString const &strlogfilespath, bool btxtfile);

問題是當我們將參數"logfiles"發送到它沒有得到它的函數中。很奇怪,因爲所有其他參數都能正確發送。

原因與CString的使用有某種聯繫。但我不知道作爲

XLSREADER_API是如何定義...:

#define XLSREADER_API extern "C" __declspec(dllimport) 

而且我在函數體的開頭添加

AFX_MANAGE_STATE(AfxGetStaticModuleState());

(用於bXR_Init) 。但它沒有幫助。我試圖改變這兩個項目的一些設置,所有設置都是相同的(例如調用轉換爲__cldecl(/ Gd);我構建調試版本exe和dll或同時發佈exe和dll版本)。

此外,我試圖用CString而不是CString& - 相同的情況。如果使用char*,它會正常工作,但老闆說,首先要找出問題的根源。

什麼可能導致問題(該函數沒有獲取CString參數)?

+0

所以程序編譯,如果我正確理解問題。是用C++編寫的dll,它使用的是MFC嗎? bXR_Init函數在strlogfilespath參數中得到了什麼,一個空字符串或垃圾? –

+0

是的,使用MFC。垃圾。 –

+0

嘗試使用反彙編窗口進行調試(但必須瞭解一些x86彙編語言)。這已經幫助我找出類似的問題(不是在Windows上)。 –

回答

0

要通過DLL邊界傳遞複雜類型(如CString),必須確保DLL和exe都使用完全相同的DLL庫。將「運行時庫」設置爲多線程DLL並將「使用MFC」設置爲在共享DLL中使用MFC。另外,不要混用調試和發佈模塊:兩者必須相同。

沒有這些條件,你會得到兩個不同的堆,你不能保持分配/刪除與兩堆兼容。

+1

#ScottMcP-MVP:沒錯,但問題在於CString參數完全是亂碼。在dll中的函數應該正確地獲取CString參數,並且即使使用不同的MFC庫和不同的堆,只要該參數未被修改,該函數也應該可以正常工作。 –

+0

@ ScottMcP-MVP:你說的所有設置都是一樣的。如果設置了類型std :: string,那麼通過這個特定的函數可以獲得這個特定的參數。 –

0

嘗試通過實際CString參數來調用:

CString sPath = "logfiles"; 
pInit(sPath,false); 
0

wtfigo! (f是怎麼回事)

問題解決了。

我發現,該exe項目有「字符集」=「使用多字節字符集」 和dll項目有「字符集」=「使用Unicode字符集」。

所以,dll函數得到了char *裏面的CString,但是認爲它是CString和wchat_t *裏面的。它看起來像垃圾(因爲我的電腦上有完整的垃圾,而我的同事的電腦上也有中文符號)。

我將exe項目的「字符集」更改爲「使用unicode字符集」,發現大約60個錯誤。 然後我讀了一篇文章http://habrahabr.ru/post/164193/(俄語;或英文:http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc)。

並修復了所有錯誤,廣泛使用來自TCHAR.h的宏(MSDN幫助了我)。

謝謝大家的幫助。

相關問題