问题1:
哪位达人能提供VS2008下 导出dll中C++类成员函数的名字修饰规则(Name decorating rules)?
(VC6和VS2008对dll导出函数的名字修饰规则是不一样的)
问题2:
有一个VC6版本的DLL工程,通过def文件导出了很多类成员函数。
现在要将该工程转到 VS2008, build时出现了很多Link Error,
error LNK2001: unresolved external symbol
我发现是VC6 和VS2008在导出DLL中的类成员函数时,名字修饰(name decorating)的规则不一样,
导致linker没法找到def文件中的函数名字。
特别是CString作为参数的函数。除了根据名字修饰规则来改def文件,还有什么解决办法?
注:最好不是导出整个类。小弟分不多,先谢过了!
而且代码量巨大,所以我不打算对代码做修改。
后来还是用def文件规范了函数名。
该dll project在vc6版本时,def就已经有了,
比如我想导出class CSDN 的成员函数 void foo(Cstring s)
vc6下,在def文件中对应的修饰后的名称是?foo@CSDN@@QAEXVCString@@@Z
而vs2008下,修饰后的名称是:
?foo@CSDN@@QAEXV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z如果不修改def文件中的修饰后的函数名,那么链接将无法通过,但是如何修改呢?
这个就是我的问题。
我尝试在网上找到 vs2008 导出函数名字修饰规则,但怎么也找不到。
1、创建一个全局函数 extern "C" void foo(LPVOID csdn, LPCSTR s),函数实现中把 csdn 转换成对象指针
2、通过DEF文件导出这个函数(注意DEF导出和 __declspec(dllexport) 导出是有区别的)
先谢谢您的关注!
我说的不导出类指的是不显式地在类声明前加 __declspec(dllexport).
现在的面临的情况是不可能再去改写CString->LPTSTR了。