最近在做项目,在动态加载动态库后,使用GetProcAddress( HMODULE hModule, LPCWSTR lpProcName)获取导出的函数的地址时,发现不能获得函数地址。
通过检查发现是声明动态库导出的定义不同导致:
在使用extern "C" __declspec(dllexport)时,可以使用GetProcAddr获得函数地址。
在使用__declspec(dllexport)时,在使用GetProcAddr时,参数lpProcName不能为导出的函数名字,否则就不能获得函数地址。
用dependency软件观察分别使用extern "C" __declspec(dllexport) 与 __declspec(dllexport)声明导出函数的区别
使用extern "C" __declspec(dllexport)声明导出函数:

使用 __declspec(dllexport)声明导出函数:

总结:
很明显,使用extern "C" __declspec(dllexport)声明导出函数,在DLL中的函数名字保持与导出函数名一致。使用__declspec(dllexport)声明导出函数,在DLL中的函数名字与导出函数名字不一致,有变化。这些差异主要是使用C方式函数C++方式编译导致的。
所以,在使用GetProcAddress( HMODULE hModule, LPCWSTR lpProcName)函数查找导出函数时,最好在DLL中用extern "C" __declspec(dllexport)声明导出函数。

本文探讨了在动态加载动态库后,使用GetProcAddress函数获取导出函数地址时遇到的问题,特别是当使用不同导出定义(externC__declspec(dllexport)与__declspec(dllexport))时的区别。详细解释了这两种情况下的函数名称变化,并强调了在DLL中使用externC__declspec(dllexport)声明导出函数的重要性。
720

被折叠的 条评论
为什么被折叠?



