【问题标题】:function in dll doesn't receive CString argument valuedll 中的函数不接收 CString 参数值
【发布时间】:2013-07-30 13:09:26
【问题描述】:

大家好。 我必须使用旧实用程序:它将 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参数)?

【问题讨论】:

  • 如果我正确理解了这个问题,程序就会编译。 dll 是用 C++ 编写的,是否使用 MFC? bXR_Init 函数在 strlogfilespath 参数中得到什么,是空字符串还是垃圾?
  • 是的,使用 MFC。垃圾。
  • 尝试用反汇编窗口调试它(不过你必须了解一些x86汇编语言)。这已经帮助我解决了类似的问题(虽然不是在 Windows 上)。

标签: dll mfc data-loss


【解决方案1】:

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

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

【讨论】:

  • #ScottMcP-MVP:没错,但这里的问题是CString参数完全乱码。 dll 中的函数应该正确获取 CString 参数,并且它应该可以使用不同的 MFC 库和不同的堆,只要参数没有被修改。
  • @ScottMcP-MVP:所有设置都和你说的一样。如果设置了 std::string 类型,则更多此特定函数将获得此特定参数。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    wtfigo! (f是怎么回事)

    问题解决了。

    我发现,那个 exe 项目有 "character set" = "use multibyte character set" 并且 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 帮助了我)。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2020-07-07
      • 1970-01-01
      相关资源
      最近更新 更多