问题:
1:DLL导出函数该用哪种调用约定?大部分看到的都是WINAPI,也就是__stdcall,但好像用__cdecl也能导出,用起来好像也没发现问题
这两种约定,无非就是谁负责清理栈的问题,理论上,如果导出的dll函数调用约定不一致,调用时就会产生栈不一至的问题,可我在实际用时默认都是__cdecl,好像也没发现异常2.该使用def文件定义导出函数,还是使用 extern "C" __declspec (dllexport) 定义导出函数?使用def文件定义导出函数的好处是使名字绝对正确
而使用extern "C" __declspec (dllexport)定义导出函数时,如果是__stdcall调用约定,导出函数名前面会被加上下画线,如果要保证函数是__stdcall,而且名字又不被修改,难道只能使用def文件?
加不加extern "C"导出函数,然后用depends查看函数名有什么区别.
__cdecl跟__stdcall没什么关系,只是在你需要用的时候声明必须对应上.
那个"异常"也只是vc检测栈.
生成的是 _Func@4__declspec(dllexport) int __stdcall Func(char* p)
生成的是 ?Func@@YGHPAD@Z
extern "C" __declspec(dllexport) int __cdecl Func(char* p)
生成的是 Func__declspec(dllexport) int __cdecl Func(char* p)
生成的是 ?Func@@YGHPAD@Z
extern "C" __declspec(dllexport) 要想名字保持原样,只能跟__cdecl配合