2017-06-06 70 views
0

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

+0

而且,您打算如何调用这些函数,而不用调用'GetProcAddress'来获取某个函数的入口点地址?另外,在这里你不是_loading_函数。整个.dll被LoadLibrary调用加载,所以当它返回时 - 所有的函数都已经被加载了。 –

+0

我在询问是否有办法让这个过程自动化。 – ViliX64

+0

您可以导出一个函数,该函数返回指向该库中所有其他函数的指针数组。 – VTT

回答

2

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

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

  1. 为您需要加载的库准备* .def文件。最简单的方法是在dll文件上启动“impdef.exe my.dll”命令。您可能会发现微小的impdef.exe不需要安装在TinyC软件包中(请参阅https://bellard.org/tcc/)。
  2. 然后通过启动“LIB /def:my.def /out:my.lib
  3. 与您的项目为常规库,链接库生产准备后对应的*的.lib文件。

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