0

大家好。我必须使用旧实用程序:它将 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 的发布版本)。

我也尝试使用CString而不是CString&- 同样的情况。如果使用它可以正常工作char*,但是老板说首先要找出问题的根源。

什么可能导致问题(函数没有获取 CString 参数)?

4

3 回答 3

0

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

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

于 2013-07-30T14:45:54.800 回答
0

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

CString sPath = "logfiles";
pInit(sPath,false);
于 2013-07-31T14:26:18.980 回答
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-等)。

并修复了所有错误,TCHAR.h 中广泛使用的宏(MSDN 帮助了我)。

谢谢大家的帮助。

于 2013-08-02T13:04:01.840 回答