加载所有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功能而不必列出它们?
由于这里"连接_*"只是一个变量,除了运行诸如调用函数之类的代码以获取函数地址之类的代码外,别无选择。Winapi在运行时没有绑定功能的批量方法。这是Winapi的限制。该方法的目的是单独检查功能的存在,并将加载库延迟到实际需要的点(或在不使用时完全避免加载(。
但是,您可以使用导入表功能在程序加载阶段绑定DLL来避免这种凌乱的代码。在这种情况下,Windows将可执行的图像加载到内存中,然后加载所有相关的DLL,并在启动可执行代码之前自动绑定导入的函数。为此,您需要:
- 准备 *.def文件为库您需要加载。最简单的方法是在dll文件上启动" impdef.exe my.dll "命令。您可能会找到不需要在TinyC软件包中安装的Tiny impdef.exe (请参阅https://bellard.org/tcc/(。
- 然后通过启动" lib/def:my.def/out:my.lib"来准备相应的 *.lib文件。
- 之后,该链接将您的项目作为常规库生成库。
此方法的缺点是,如果不存在或损坏DLL,则无法启动您的可执行文件。但这是为了方便导入功能的小额付款。
相关文章:
- MFC/DLL中缺少ATL :: CSTRINGT功能,该功能与Clang/vs-2019构建
- 加载所有DLL功能
- 在C 功能执行后,使用GCHANDLE CRALSES将大型结构从C#Unity脚本传递到C DLL
- 来自Pascal DLL/SO中的C 加载和调用功能
- 我应该如何分享该过程和多个DLL之间的功能列表
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- 从DLL到EXE C 的呼叫功能
- 使用C /CLI包装器DLL时缺少功能
- 如何从Java中的C DLL加载和使用结构和功能
- 我可以用具有相同功能名称的多个DLL加载元素吗?
- C 通过引用DLL中的功能传递std ::字符串
- 调用包含C#功能指针的DLL函数
- 在DLL中导出功能.C和C
- 从X86 DLL获取导出功能
- 如何从Delphi编译的DLL中调用C 中的功能
- 功能在DLL中
- 错误:在C#中调用C DLL功能
- 如何将多个静态链接库合并到一个dll中,给定每个静态库定义导出的功能(vc++2008)
- c静态库在cpp dll中的功能
- 是否有用于修改AutoHotkey_L中DLL调用功能的标准协议