Dll导出函数名字修饰的问题!(VC6 DLL port to VS2008)

The_eagles 2010-10-03 12:08:32

问题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文件,还有什么解决办法?
注:最好不是导出整个类。

小弟分不多,先谢过了!
...全文
380 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
光宇广贞 2010-10-04
  • 打赏
  • 举报
回复
VB6……
我建议重写。
lazy_2010 2010-10-04
  • 打赏
  • 举报
回复
使用输出类的代价,外面再封装一个 regular dll 吧,就不用修改之前的 dll 了。
信阳毛尖 2010-10-03
  • 打赏
  • 举报
回复
在头文件中需要将函数声明为类似如下试试

extern "C" int __declspec(dllexport) func(int num1, int num2);

傻X 2010-10-03
  • 打赏
  • 举报
回复
关键字用了没?extern "C" __declspec(dllexport)
傻X 2010-10-03
  • 打赏
  • 举报
回复
学习了,其实方法还是有的,只不过楼主不想用。
蒋晟 2010-10-03
  • 打赏
  • 举报
回复
那就没有办法了,CString在VC6是类在之后的版本是模板,不可能跨版本兼容的。
The_eagles 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jameshooo 的回复:]
不可能不导出类而直接导出类成员函数,而且参数不要使用CString,应该使用LPCSTR或者LPCWSTR,否则挂了都不知道原因。

建议的做法:
1、创建一个全局函数 extern "C" void foo(LPVOID csdn, LPCSTR s),函数实现中把 csdn 转换成对象指针
2、通过DEF文件导出这个函数(注意DEF导出和 __declspec(dllexport) 导……
[/Quote]

先谢谢您的关注!
我说的不导出类指的是不显式地在类声明前加 __declspec(dllexport).
现在的面临的情况是不可能再去改写CString->LPTSTR了。

野男孩 2010-10-03
  • 打赏
  • 举报
回复
def中只导出类的某个成员函数??没干过。。。。
maoxing63570 2010-10-03
  • 打赏
  • 举报
回复
我把我用vc6.0做的.dll文件通过def文件导出函数编译成功后放到vs2008中来用,没有出现你说的问题,你把你的def文件发上来看看
jameshooo 2010-10-03
  • 打赏
  • 举报
回复
不可能不导出类而直接导出类成员函数,而且参数不要使用CString,应该使用LPCSTR或者LPCWSTR,否则挂了都不知道原因。

建议的做法:
1、创建一个全局函数 extern "C" void foo(LPVOID csdn, LPCSTR s),函数实现中把 csdn 转换成对象指针
2、通过DEF文件导出这个函数(注意DEF导出和 __declspec(dllexport) 导出是有区别的)
maoxing63570 2010-10-03
  • 打赏
  • 举报
回复
那么你尝试用dumpbin找出每个函数的导出序号,用上面说的那个宏来做
The_eagles 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 maoxing63570 的回复:]
用def文件应该不会出现这样的问题,还可以用导出时候的序号,然后用MAKEINTRESOURCE宏来做,另外还有注意下调用约定
[/Quote]

该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 导出函数名字修饰规则,但怎么也找不到。
keanuzb 2010-10-03
  • 打赏
  • 举报
回复
最好还是用def文件,我的环境是vs2010 express.尝试extern "C"的各种方法,输出的名字都是很奇怪的。类似?add@@YGHHH@Z。
后来还是用def文件规范了函数名。
maoxing63570 2010-10-03
  • 打赏
  • 举报
回复
用def文件应该不会出现这样的问题,还可以用导出时候的序号,然后用MAKEINTRESOURCE宏来做,另外还有注意下调用约定
The_eagles 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tiger9991 的回复:]
关键字用了没?extern "C" __declspec(dllexport)
[/Quote]
导出的是C++类成员函数,因为有重载,所以无法用extern "C"方式导出,
而且代码量巨大,所以我不打算对代码做修改。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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