在dll中使用def文件定义导出函数名,保证导出“函数”名字不会前后增加其他字符。这个在论坛上或者其他地方都有大量文章说明。而且也实践成功,觉得这个方法不错.
下面是def文件的内容示意,其中Show,Go,Alert是导出“函数”的名称,用depend查看生成的dll,函数名称可以保证完全一致,不会存在前后乱字符。LIBRARY      "MyDll"
DESCRIPTION  'MyDll'
EXPORTS
    ; Explicit exports can go here
Show
Go
Alert但是,导出“类”的时候,def文件不知道怎么写,所以只是使用了dllexport定义,但是生成的dll我用depends查看的时候,有类似如下内容
?Initialize@CMyClass@@SAXXZ
?GenerateStr@CMyClass@@QAEHAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0V23@@Z如果我也想使用def文件来解决这些乱字符的话,def文件该怎么写呢?

解决方案 »

  1.   

    C++类函数导出就是这样的,另外,这并不是乱字符,每个字符都有它的含义来表示这个函数的signature和返回值的,具体的那个字母是什么意思忘了,.. MSDN中应该有的
      

  2.   

    如果楼主想去掉这些乱字符,不知道VC会不会识别出这个类了。导出的类应该是C++程序才能使用的,在使用时实际上是没有这些字符的,这点和C的不一样,个人觉得没有这个必要来重新编码。
      

  3.   

    刚才去翻了翻,找到参考了:C++编译时函数名修饰约定规则:
    __stdcall调用约定:
    1、以"?"标识函数名的开始,后跟函数名;
    2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;
    3、参数表以代号表示:
    X--void ,
    D--char,
    E--unsigned char,
    F--short,
    H--int,
    I--unsigned int,
    J--long,
    K--unsigned long,
    M--float,
    N--double,
    _N--bool,
    ....
    PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以"0"代替,一个"0"代表一次重复;
    4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前; 
    5、参数表后以"@Z"标识整个名字的结束,如果该函数无参数,则以"Z"标识结束。
    其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如
              int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”
              void Test2()                       -----“?Test2@@YGXXZ”__cdecl调用约定:
    规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"。
    __fastcall调用约定:
    规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI"。
    如果要用DEF文件输出一个"C++"类,则把要输出的数据和成员的修饰名都写入.def模块定义文件
    所以... 通过def文件来导出C++类是很麻烦的,并且这个修饰名是不可避免的