dll中的函数不';t接收CString参数值

dll中的函数不';t接收CString参数值,dll,mfc,data-loss,Dll,Mfc,Data Loss,大家好。 我必须使用旧的实用程序:它将xls转换为txt。 在效用的逻辑上有一个小问题,但问题在另一件事上。。。 该实用程序由两部分组成:exe模块和dll模块,并使用MFC 在exe项目中,我们有 pInit=(t_bXR_Init)GetProcAddress(hExcel,_t(“bXR_Init”) 及 pInit(“日志文件”,false) 在dll项目中,我们有 typedef bool(*t_bXR_Init)(CString const&strlogfilepath,bool b

大家好。 我必须使用旧的实用程序:它将xls转换为txt。 在效用的逻辑上有一个小问题,但问题在另一件事上。。。 该实用程序由两部分组成:exe模块和dll模块,并使用MFC

在exe项目中,我们有

pInit=(t_bXR_Init)GetProcAddress(hExcel,_t(“bXR_Init”)

pInit(“日志文件”,false)

在dll项目中,我们有

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

问题是当我们将参数
“logfiles”
发送到函数中时,它没有得到它。这很奇怪,因为所有其他参数都正确发送

原因与使用CString有关。但我不知道怎么

XLSREADER_API的定义如下:

#define XLSREADER_API extern "C" __declspec(dllimport)
我还补充了

AFX_管理_状态(AfxGetStaticModuleState())

在函数体的开头(对于bXR_Init)。但这没用

我还尝试更改这两个项目的一些设置,所有设置都是相同的(例如,调用转换为_cldecl(/Gd);我同时生成调试版本的exe和dll或发布版本的exe和dll)

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


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

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


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

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

CString sPath = "logfiles";
pInit(sPath,false);
wtfigo!(f是怎么回事)

问题解决了

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

因此,dll函数得到了内部带有char*的CString,但认为它是内部带有wchat_t*的CString。它看起来像垃圾(在我的电脑上是完全的垃圾,在我同事的电脑上是中文符号)

我将exe项目的“字符集”更改为“使用unicode字符集”,并发现了大约60个错误。 然后我读了一篇文章(俄语;或英语:)

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


谢谢大家的帮助。

如果我理解正确的话,程序可以编译了。是用C++编写的DLL,是用MFC编写的吗?bXR_Init函数在strlogfilespath参数中得到什么、空字符串或垃圾?是的,使用MFC。垃圾。尝试用反汇编窗口调试它(不过您必须了解一些x86汇编语言)。这已经帮助我解决了类似的问题(但不是在Windows上)。#ScottMcP MVP:对,但这里的问题是CString参数完全乱码。dll中的函数应该正确地获取CString参数,即使在不同的MFC库和不同的堆中,只要参数没有被修改,它也应该工作。@ScottMcP MVP:所有设置都与您所说的相同。如果设置了std::string类型,则此特定函数将获得此特定参数。