关于动态连接库中def文件的有关问题
; File VCR.DEFLIBRARY VCR.DLLEXPORTS
?GetSignalValue@CVcr@@QAEJXZ
??0CVcr@@QAE@XZ 这是一个def文件。我的函数名字是long CVcr::GetSignalValue()def文件中写成 ?GetSignalValue@CVcr@@QAEJXZ
是有什么规律,还是随机生成的。
; File VCR.DEFLIBRARY VCR.DLLEXPORTS
?GetSignalValue@CVcr@@QAEJXZ
??0CVcr@@QAE@XZ 这是一个def文件。我的函数名字是long CVcr::GetSignalValue()def文件中写成 ?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调用约定是有规律的有错,楼下的请指出
函数原型是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++函数的修饰名
我补充的是为什么EXPORT中函数前有个"?"
因为C++用了函数重载,而编译器对这么多的同函数名的函数进行区别都会加个前缀
"?"就是前缀.这样才能确定调用那个函数
但当用到C调用约定时,就不用用到了.
因为编译器根据@后面的变量字节数来区别.