关于VC 6.0 和 VC 2008 中CString不兼容的问题

lostangels 2009-03-24 09:39:53
我公司原来用VC 6.0开发了一个MFC扩展dll,该dll导出了一个接口函数 void function(CString& str),在该函数中将改变str变量的值;另外又开发了一个MFC的exe程序来调用这个dll并访问这个接口。现在使用VC 2008重新编译了exe程序之后,发现调用接口函数时,在给str变量赋值时会出现异常。请问这真的是VC 6.0 和 VC 2008的CString不兼容造成的吗?又该如何解决呢?而且鉴于目前现有模块的应
,想将VC 6.0开发的dll再重新修改、编译是不实际的。

// 在dll中导出的接口函数,dll程序使用 VC 6.0 编译
__declspec(dllexport) void function(CString& str)
{
str = "aaa";
}


// 在exe中调用dll中导出的接口函数,exe程序使用 VC 2008编译
typedef void (CALLBACK* LPFNDLLFUNC)(CString& str);

void call_dll_function()
{
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC lpfnDllFunc; // Function pointer
CString str;
hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
lpfnDllFunc = (LPFNDLLFUNC)GetProcAddress(hDLL,"function");
if (!lpfnDllFunc)
{
FreeLibrary(hDLL);
return;
}
else
{
// 调用接口函数,进入dll接口函数后,会出现异常
lpfnDllFunc(str);
}
}
}
...全文
405 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
#Page# 2009-03-26
  • 打赏
  • 举报
回复
呵呵,同意楼上的
bluebee2009 2009-03-26
  • 打赏
  • 举报
回复
最好不要采用CString类型当参数,一定要改改改改……不然还有更惨的问题。
我N年前也有试过CString当导出函数的参数,会有内存泄露。
scsnsjsl_cs_dn 2009-03-26
  • 打赏
  • 举报
回复
学习了
阿先森 2009-03-25
  • 打赏
  • 举报
回复
建议使用LPCTSTR
devrauber 2009-03-25
  • 打赏
  • 举报
回复
用VC6再做一个DLL。把CSTRING接口的函数封装成WCHAR*类型的
robert_duan 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wanglcho_cn 的回复:]
typedef void (CALLBACK* LPFNDLLFUNC)(CString& str);

定义__cdecl,__stdcall可能不匹配 自己查下

2008兼容vc6
[/Quote]

Up
把编译出错误息给出来.
wanglcho_cn 2009-03-25
  • 打赏
  • 举报
回复
typedef void (CALLBACK* LPFNDLLFUNC)(CString& str);

定义__cdecl,__stdcall可能不匹配 自己查下

2008兼容vc6
  • 打赏
  • 举报
回复
使用同一个版本的编译器 重新编译.

如果不行你将VC6的CString实现拷贝过来用.再不行就没啥办法了.
yzzrn 2009-03-24
  • 打赏
  • 举报
回复
另外再做一个什么东西将原来的DLL包装一下。
lostangels 2009-03-24
  • 打赏
  • 举报
回复
感谢楼上的答复。
历史原因造成了接口参数为CString,现在已经没有办法修改了,否则就造成接口不兼容了。

现在dll和exe都是以MBCS的方式进行编译的,而且都是release版本编译,
在这种情况下,是否有什么好办法可以解决?
多谢各位答复
chunjielee 2009-03-24
  • 打赏
  • 举报
回复
同意楼上的说法,用CString做dll的参数有点.....怪怪的.

char*、LPCSTR等才是正道
菜牛 2009-03-24
  • 打赏
  • 举报
回复
将调用端修改为多字节编码。其实DLL导出函数中用特定类作为参数本身就是不好的,应该用通用变量类型。
moonzero 2009-03-24
  • 打赏
  • 举报
回复
mark
chunjielee 2009-03-24
  • 打赏
  • 举报
回复
不兼容的可能性不大.

和编译时的版本有关系,dll如果是release版本的,你2008这里的exe最好也选择用release版本编译.

另外static dll link模式也容易导致此问题
sys0009 2009-03-24
  • 打赏
  • 举报
回复
没啥办法,一个是普通类,一个是模板类。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧