调用DLL(C++)

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

目录

  • 1.显式调用
    • 1.1.常用函数
      • 1.1.1LoadLibrary
      • 1.1.2GetProcAddress
      • 1.1.3FreeLibrary
    • 1.2.例子
  • 2.隐式调用(暂未调研)

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.隐式调用(暂未调研)

你可能感兴趣的:(c++,开发语言)