加载所有DLL功能



有没有办法从运行时加载的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功能而不必列出它们?

由于这里"连接_*"只是一个变量,除了运行诸如调用函数之类的代码以获取函数地址之类的代码外,别无选择。Winapi在运行时没有绑定功能的批量方法。这是Winapi的限制。该方法的目的是单独检查功能的存在,并将加载库延迟到实际需要的点(或在不使用时完全避免加载(。

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

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

此方法的缺点是,如果不存在或损坏DLL,则无法启动您的可执行文件。但这是为了方便导入功能的小额付款。

最新更新