问题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文件,还有什么解决办法?
注:最好不是导出整个类。小弟分不多,先谢过了!

解决方案 »

  1.   

    关键字用了没?extern "C" __declspec(dllexport)
      

  2.   

    在头文件中需要将函数声明为类似如下试试        extern "C"   int __declspec(dllexport)   func(int num1, int num2);
      

  3.   

    导出的是C++类成员函数,因为有重载,所以无法用extern "C"方式导出,
    而且代码量巨大,所以我不打算对代码做修改。
      

  4.   

    用def文件应该不会出现这样的问题,还可以用导出时候的序号,然后用MAKEINTRESOURCE宏来做,另外还有注意下调用约定
      

  5.   

    最好还是用def文件,我的环境是vs2010 express.尝试extern "C"的各种方法,输出的名字都是很奇怪的。类似?add@@YGHHH@Z。
    后来还是用def文件规范了函数名。
      

  6.   


    该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 导出函数名字修饰规则,但怎么也找不到。
      

  7.   

    那么你尝试用dumpbin找出每个函数的导出序号,用上面说的那个宏来做
      

  8.   

    不可能不导出类而直接导出类成员函数,而且参数不要使用CString,应该使用LPCSTR或者LPCWSTR,否则挂了都不知道原因。建议的做法:
    1、创建一个全局函数 extern "C" void foo(LPVOID csdn, LPCSTR s),函数实现中把 csdn 转换成对象指针
    2、通过DEF文件导出这个函数(注意DEF导出和 __declspec(dllexport) 导出是有区别的)
      

  9.   

    我把我用vc6.0做的.dll文件通过def文件导出函数编译成功后放到vs2008中来用,没有出现你说的问题,你把你的def文件发上来看看
      

  10.   

    def中只导出类的某个成员函数??没干过。
      

  11.   


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

  12.   

    那就没有办法了,CString在VC6是类在之后的版本是模板,不可能跨版本兼容的。
      

  13.   

    使用输出类的代价,外面再封装一个 regular dll 吧,就不用修改之前的 dll 了。