dll中的函数不接收CString参数值

时间:2013-07-30 13:09:26

标签: dll mfc data-loss

大家好。 我必须使用旧的实用程序:将xls转换为txt。 该实用程序的逻辑存在一个小问题,但问题在于其他问题...... 该实用程序由两部分组成:exe模块和dll模块,并使用MFC。

在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版本)。< / p>

此外,我尝试使用CString代替CString& - 同样的情况。如果使用char*,它可以正常工作,但老板说要先找到问题的根源。

可能导致问题的原因(函数没有获得CString参数)?

3 个答案:

答案 0 :(得分:0)

要跨DLL边界传递复杂类型(如CString),必须确保DLL和exe都使用完全相同的DLL库。将“运行时库”设置为多线程DLL并将“使用MFC”设置为在共享DLL中使用MFC。另外,不要混合调试和发布模块:两者必须相同。

如果没有这些条件,您将获得两个不同的堆,并且您无法使分配/删除与两个堆保持兼容。

答案 1 :(得分:0)

尝试将实际CString参数传递给调用:

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

答案 2 :(得分:0)

wtfigo! (f是怎么回事)

问题解决了。

我发现,exe项目有“字符集”=“使用多字节字符集” 和dll项目有“字符集”=“使用unicode字符集”。

所以,dll函数在内部使用char *获得了CString,但是将其视为带有wchat_t *的CString。它看起来像垃圾(我的电脑上的完全垃圾和我同事的电脑上的中文符号)。

我将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帮助了我)。

感谢大家的帮助。