调用DLL(C++)

最近用到动态链接库,调用DLL文件,有两种方式,分别是显示调用和隐式调用,隐式调用是是直接将DLL文件、头文件(.h文件)、LIB文件放入到项目中,启动的时候给动态链接库分配内存,而动态链接是用函数加载dll文件,比较灵活,所以我就使用了显式调用。后来发现在代码中如果频繁使用动态链接库,还不如使用隐式调用

1.显式调用

1.1.常用函数

1.1.1LoadLibrary

将指定的模块加载到调用进程的地址空间中,语法为:

HMODULE LoadLibraryA(
  [in] LPCSTR lpLibFileName
);
  • lpLibFileName:动态链接库地址
  • HMODULE:动态链接库模块

1.1.2GetProcAddress

从指定的动态链接库 (DLL) 检索导出函数 (也称为过程) 或变量。

FARPROC GetProcAddress(
  [in] HMODULE hModule,
  [in] LPCSTR  lpProcName
);
  • hModule:动态链接库模块
  • lpProcName:函数名称,如果函数使用了命名空间,也不用写命名空间
  • FARPROC:导出的函数或变量的地址,可以使用typedef定义函数指针和变量指针来使用

1.1.3FreeLibrary

释放加载的动态链接库 (DLL) 模块,并在必要时递减其引用计数。 当引用计数达到零时,将从调用进程的地址空间卸载模块,并且句柄不再有效。

BOOL FreeLibrary(
  [in] HMODULE hLibModule
);
  • hLibModule:动态链接库模块
  • BOOL:如果该函数成功,则返回值为非零值。如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError 函数。

1.2.例子

  • 定义函数指针

typedef void(*SUCESS)(const std::string&, std::string&);

  • 调用函数
HMODULE utilsDll = ::LoadLibraryA("./lib/utils/utils.dll");
SUCESS sucess = SUCESS(GetProcAddress(utilsDll, "SUCESS"));
std::string out;
sucess("file", out);
FreeLibrary(utilsDll);

2.隐式调用(暂未调研)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值