加载所有DLL函数

时间:2017-06-06 12:45:52

标签: 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函数而不必列出它们?

1 个答案:

答案 0 :(得分:2)

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

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

  1. 为您需要加载的库准备* .def文件。最简单的方法是在dll文件上启动“ impdef.exe my.dll ”命令。您可能会发现不需要在TinyC包中安装的小型 impdef.exe (请参阅https://bellard.org/tcc/)。
  2. 然后通过启动“ lib /def:my.def /out:my.lib”准备相应的* .lib文件
  3. 在该链接生成库与您的项目作为常规库。
  4. 此方法的缺点是,如果DLL不存在或已损坏,则您的可执行文件根本不会启动。但这是为了方便导入功能而支付的小额款项。