用viewdll.exe可以查看dll的导出函数,如下图所示。
下载地址(至2019-09-23可用):http://www.opdown.com/soft/102914.html
viewdll.exe不能查看64bit的dll。Dll Export Viewer(dllexp.exe)可以。地址http://www.nirsoft.net/utils/dll_export_viewer.html。

在Qt中导出函数时,采用如下格式,__cdecl 调用约定,这样导出的函数就是函数名(下面的例子中是"add"),确保调用时正确。
其中的 extern "C"的目的:告诉编译器,用C语言的格式进行编译。
#if defined(MYDLL_LIBRARY)
# define MYDLLSHARED_EXPORT __declspec(dllexport)
#else
# define MYDLLSHARED_EXPORT __declspec(dllimport)
#endif
namespace MY_DLL {MYDLLSHARED_EXPORT int __cdecl cdecl_subtract(int x, int y);}
namespace MY_DLL2 { MYDLLSHARED_EXPORT int __cdecl cdecl_subtract(int x, int y); }
extern "C" MYDLLSHARED_EXPORT int __cdecl cdecl_add(int x, int y);
extern "C" MYDLLSHARED_EXPORT int __stdcall stdcall_add(int x, int y);
MYDLLSHARED_EXPORT int __cdecl cpp_cdecl_sub(int x, int y);
MYDLLSHARED_EXPORT int __stdcall cpp_stdcall_sub(int x, int y);
可以看出,编译器对namespace里的函数名做了特殊的处理。

1)调用协议常用场合
__stdcall:Windows API默认的函数调用协议。
__cdecl:C/C++默认的函数调用协议。
2)函数参数入栈方式
__stdcall:函数参数由右向左入栈。
__cdecl:函数参数由右向左入栈。
3)栈内数据清除方式
__stdcall:函数调用结束后由被调用函数清除栈内数据。
__cdecl:函数调用结束后由函数调用者清除栈内数据。
4)C语言编译器函数名称修饰规则
__stdcall:编译后,函数名被修饰为“_functionname@number”。
__cdecl:编译后,函数名被修饰为“functionname”。
5)C++语言编译器函数名称修饰规则
__stdcall:编译后,函数名被修饰为“?functionname@@YG******@Z”。
__cdecl:编译后,函数名被修饰为“?functionname@@YA******@Z”。
————————————————
版权声明:本文为CSDN博主「OldWang-AI」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liminwang0311/article/details/77170932
参考:
网友评论