Qt中导出和查看 DLL 函数

用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。

用dllview.exe查看dll的导出函数和依赖项

在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里的函数名做了特殊的处理。

C/C++和_cdecl/__stdcall下的导出函数名

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


参考:

extern "C"在DLL导出函数时有什么作用?

你可能感兴趣的:(Qt中导出和查看 DLL 函数)