关于动态连接库中def文件的有关问题
; File VCR.DEFLIBRARY      VCR.DLLEXPORTS
?GetSignalValue@CVcr@@QAEJXZ     
??0CVcr@@QAE@XZ  这是一个def文件。我的函数名字是long CVcr::GetSignalValue()def文件中写成 ?GetSignalValue@CVcr@@QAEJXZ     
是有什么规律,还是随机生成的。

解决方案 »

  1.   

    ?GetSignalValue@CVcr@@QAEJXZ     
    ??0CVcr@@QAE@XZ  这个函数名是你自己写的吧,DEF不可能自己去生成的!这应该是_cdecl约定,你可以自己对比下它与_stdcall约定的区别(前者为C调用约定,后者为PASCAL调用约定,也是WINDOWS默认的调用约定)
    一般_stdcall的约定是这样的,在函数前加一下划线,后面一@符,再加参数的字节数
    如 void _stdcall test(int a ,int b) 则它变成_test@8这样的名字,也就是名字改编!呵呵,扯着掉着就扯远了def文件中写成 ?GetSignalValue@CVcr@@QAEJXZ     
    是有什么规律,还是随机生成的。
    有的有规律,有的是随机的吧,至少可以看到PASCAL调用约定是有规律的有错,楼下的请指出
      

  2.   

    并不是随机的,是有规则的。比如:
    函数原型是void CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_stdcall。
    不同调用约定下的修饰名
    调用约定 
    extern “C”或.C文件 
    .cpp, .cxx或/TP编译开关 _cdecl 
    _test 
    ?test@@ZAXXZ _fastcall 
    @test@0 
    ?test@@YIXXZ _stdcall 
    _test@0 
    ?test@@YGXXZ 
    -------
    具体你可以查一查 C++函数的修饰名
      

  3.   

    上面的基本上说了.
    我补充的是为什么EXPORT中函数前有个"?"
    因为C++用了函数重载,而编译器对这么多的同函数名的函数进行区别都会加个前缀
    "?"就是前缀.这样才能确定调用那个函数
    但当用到C调用约定时,就不用用到了.
    因为编译器根据@后面的变量字节数来区别.