C++调用动态库DLL注意事项

导出DLL注意事项

如果使用者是利用 头文件和LIB静态链接库 使用DLL的话,那么就正常写函数声明即可:

extern "C" __declspec(dllexport) int __stdcall add(int a, int b);

如果调用者知道动态库中的函数而直接 显式调用 的话(Depends工具可以查看DLL中函数),那么导出的DLL库,需要在源文件目录下额外添加def模板定义文件,内容格式如下:

LIBRARY

EXPORTS
	add;

在EXPORTS下,写明你的函数名字,因为编译器导出的DLL文件中,函数名字会被更改(比如add函数名,可能他实际的函数名字会变成add@1这样子)这种方法显式告诉编译器导出的函数名字,使用的时候才不会报错。

使用DLL注意事项

这里注意事项还是显式调用时要注意的,例如下面的调用代码:

#include <iostream>
#include <windows.h>

int main()
{
	HMODULE hM = LoadLibrary(L"startDLL.dll");

	if (!hM)
	{
		 std::cout << "加载库失败!" << std::endl;
		 return -1;
	}

	typedef int (*MyAdd)(int a, int b);  // 注意这一行!!!!!!!!!!!!!!!!!!!

	MyAdd add = (MyAdd)GetProcAddress(hM, "add");

	std::cout << "计算结果是:" << add(133, 4124) << std::endl;

	return 0;
}

死活跑不通,跑不通的其实要声明标准C接口调用,那么我上面做注释的地方应该这么写:

typedef int (WINAPI *MyAdd)(int a, int b);  // 正确写法,多了一个 WINAPI

这里WINAPI的定义是:

#define WINAPI __stdcall
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值