c++ - 加载所有 DLL 函数

标签 c++ dll shared-libraries

有没有办法从运行时加载的 DLL 中加载所有函数?当前代码:

hGetProcIDDLL = LoadLibrary(dll);

typedef int(*f_connection_a)(args);
typedef int(*f_connection_b)(args);
typedef int(*f_connection_c)(args);

f_connection_a connection_a = (f_connection_a)GetProcAddress(hGetProcIDDLL, "connection_a");
f_connection_b connection_b = (f_connection_b)GetProcAddress(hGetProcIDDLL, "connection_b");
f_connection_c connection_c = (f_connection_c)GetProcAddress(hGetProcIDDLL, "connection_c");

如您所见,这很快就会变得很麻烦,因为您必须像这样定义每个 DLL 函数。有没有一种方法可以加载所有 DLL 函数而不必列出它们?

最佳答案

因为这里的“connection_*”只是一个变量,除了运行一段代码,比如调用一个函数来获取一个函数的地址之外,没有办法初始化它们。 WinAPI 没有在运行时绑定(bind)函数的批量方法。这是 WinAPI 的限制。此方法的目的是单独检查函数的存在,并将库加载延迟到实际需要时(或者如果不使用则完全避免加载)。

但是您可以通过在程序加载阶段使用 Import Table 功能绑定(bind) DLL 来避免这种困惑的代码。在这种情况下,Windows 将可执行镜像加载到内存中,然后加载所有相关的 DLL,并在启动可执行代码之前 自动绑定(bind)导入的函数。为此,您需要:

  1. 为您需要加载的库准备*.def 文件。最简单的方法是在 dll 文件上启动“impdef.exe my.dll”命令。您可能会在 TinyC 包中找到不需要安装的微型 impdef.exe(参见 https://bellard.org/tcc/)。
  2. 然后启动“lib/def:my.def/out:my.lib”准备相应的*.lib文件
  3. 之后将生成的库作为常规库与您的项目链接。

这种方法的缺点是,如果 DLL 不存在或损坏,您的可执行文件将根本无法启动。但这是为了方便导入功能而付出的小代价。

关于c++ - 加载所有 DLL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44390406/

相关文章:

c -/usr/bin/ld : cannot find shared library

c++ - 如何设置终端窗口的固定大小?

c++ - 是否可以对参数包进行类型定义?

python - Jamroot (boost-bjam) 与共享库链接

python - 如何将 Python 包编译为 dll

c++ - 如何安装在 windowsservercore Docker 镜像上执行 native C++ DLL/EXE 所需的所有依赖二进制文件

c++ - "No such file or directory"链接器错误,LD_LIBRARY_PATH 设置正确

c++ - C 和 C++ 中 const 变量的不同输出

c++ - Stringstreams 不工作 C++

C# - dll 引用如何工作?