关于GetProcAddress返回错误代码为127的解决方案

关于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实现的代码没有列出。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值