有没有办法从运行时加载的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 :(得分:2)
由于这里“connection_ *”只是一个变量,除了运行代码(例如调用函数来获取函数的地址)之外,没有办法初始化它们。 WinAPI在运行时没有用于绑定函数的批量方法。这是WinAPI的限制。这种方法的目的是单独检查函数的存在,并将加载库延迟到实际需要时(或者如果不使用则完全避免加载)。
但是你可以通过使用Import Table功能在程序加载阶段绑定DLL来避免这种混乱的代码。在这种情况下,Windows将可执行映像加载到内存中,然后加载所有相关DLL并在启动可执行代码之前自动绑定导入的函数。为此你需要:
此方法的缺点是,如果DLL不存在或已损坏,则您的可执行文件根本不会启动。但这是为了方便导入功能而支付的小额款项。