加载所有 DLL 函数
Loading all DLL functions
有没有办法从运行时加载的 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 在 运行 时没有用于绑定函数的批量方法。这是 WinAPI 的限制。此方法的目的是单独检查函数的存在,并将库加载延迟到实际需要时(或者如果不使用则完全避免加载)。
但是您可以通过在程序加载阶段使用导入 Table 功能绑定 DLL 来避免这些混乱的代码。在这种情况下,Windows 将可执行映像加载到内存中,然后加载所有依赖的 DLL 并在 启动可执行代码之前自动绑定导入的函数。为此你需要:
- 为您需要加载的库准备*.def 文件。最简单的方法是在 dll 文件上启动“impdef.exe my.dll”命令。您可能会在 TinyC 包中找到不需要安装的微小 impdef.exe(参见 https://bellard.org/tcc/)。
- 然后启动"lib /def:my.def /out:my.lib"
准备相应的*.lib文件
- 之后 link 将您的项目作为常规库生成库。
这种方法的缺点是如果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 函数而不必列出它们?
因为这里"connection_*"只是一个变量,除了运行一段代码,比如调用一个函数来获取一个函数的地址,没有办法初始化它们。 WinAPI 在 运行 时没有用于绑定函数的批量方法。这是 WinAPI 的限制。此方法的目的是单独检查函数的存在,并将库加载延迟到实际需要时(或者如果不使用则完全避免加载)。
但是您可以通过在程序加载阶段使用导入 Table 功能绑定 DLL 来避免这些混乱的代码。在这种情况下,Windows 将可执行映像加载到内存中,然后加载所有依赖的 DLL 并在 启动可执行代码之前自动绑定导入的函数。为此你需要:
- 为您需要加载的库准备*.def 文件。最简单的方法是在 dll 文件上启动“impdef.exe my.dll”命令。您可能会在 TinyC 包中找到不需要安装的微小 impdef.exe(参见 https://bellard.org/tcc/)。
- 然后启动"lib /def:my.def /out:my.lib" 准备相应的*.lib文件
- 之后 link 将您的项目作为常规库生成库。
这种方法的缺点是如果DLL不存在或损坏,您的可执行文件将根本无法启动。但这是为了方便导入功能而付出的小代价。