关于GetProcAddress返回错误代码为127的解决方案
运行期间显示地去加载DLL库,当LoadLibrary可以返回当前DLL模块的句柄时,而GetProcAddress取得函数的地址为空时。通过GetLastError去获取错误代码为127,很有可能是动态链接库工程里面函数声明的没有加extern “C”。
解决方案
只针对自己写的dll项目提供解决方案,如果是拿的第三方的动态链接库出这样的问题,不在此解决方案中。
通常写dll工程的时候,头文件都会有类似与这样的
#ifndef PCH_H
#define PCH_H
#else
#endif //PCH_H
当我们想要显示的导出自己的函数在其他工程中使用时,需要使用extern "C"去导出自己的函数。关于为什么要用extern “C”,貌似是C++方面没什么标准,不同的编译器可能产生不同的修饰。加入了extren “C”,不会有额外的修饰,这样就统一了。
在头文件应该这样写
#ifndef PCH_H
#define PCH_H_API extern "C" __declspec(dllexport)
#else
#define PCH_H_API __declspec(dllimport)
#endif //PCH_H
PCH_H_API void ExportFunc(LPCTSTR pszContent);//这里就是需要导出的函数,增加了extern "C"的修饰
这里用到了简单的宏,不然的话,全部写出还是有点点多的
extern "C" {
__declspec(dllexport) void ExportFunc(LPCTSTR pszContent);
} //这个代码块等同于上面的PCH_H_API void ExportFunc(LPCTSTR pszContent)
然后在另一个项目中测试
int main()
{
HMODULE hModule = ::LoadLibrary("..\\DllTest\\Debug\\DllTest.dll");
if (hModule != NULL)
{
PFNEXPORTFUNC mExportFunc = (PFNEXPORTFUNC)::GetProcAddress(hModule, "ExportFunc");
int n = GetLastError();
if (mExportFunc != NULL)
{
mExportFunc("大家好");
}
::FreeLibrary(hModule);
}
return 0;
}
这样GetLastError()就不会返回127,可以调用dll中的mExportFunc函数了。以上皆是主要代码,部分其他的代码如Dll中mExportFunc实现的代码没有列出。