windows - 将库 (DLL) 显式加载到旧版函数指针中
问题描述
我会尽量具体。
我需要在运行时将 PythonXX.dll 显式加载到我的例程中。我使用名义描述 (Python.h) 来描述函数。问题是链接器抱怨这些例程不存在。我无法更改函数定义以使链接器满意,因为 Python #include 代码结构分散。
在这一点上,我的想法是创建存根例程,该例程调用要在运行时加载 .dll 时加载的函数指针。存根使链接器感到满意,并且在运行时加载 .dll 时它们可以正确运行。但这也有一些问题。[有些函数是其他例程的#defines,varags难以重定向等]
有一个更好的方法吗?我不敢相信这以前没有发生过。如果有任何不清楚的地方,我将编辑并清理问题以澄清。
更新:好的,这似乎可行,至少在某些例程中是这样。(幸运的是,我只需要使用 .dll 的 1000 多个函数中的大约 20 个)
示例函数指针定义:
int (__cdecl *pPy_IsInitialized)(void);
一个示例存根:
int Py_IsInitialized()
{
return pPy_IsInitialized();
}
一个示例分配(dll 从 LoadLibrary() 返回):
pPy_IsInitialized = (void *)GetProcAddress(dll,"Py_IsInitialized");
解决方案
您最好的选择是使用延迟加载的 DLL。此功能会延迟 DLL 的加载(PythonXX.dll
在您的情况下),直到调用它的任何函数。您可以通过延迟加载辅助函数自定义实际的库加载(例如从特定位置加载)。
作为旁注,您在问题中提出的解决方案非常有意义并且易于自动化。延迟加载的 DLLS 为 Windows 实现了它,而我的Implib.so为 Linux 共享库实现了相同的功能。
推荐阅读
- javascript - 使用 Javascript 添加公式时解析 #Error
- c# - OAuth 实现 2.0 使用 .Net Core , Swagger
- javascript - 如何从父窗口更改 iframe 上的域?
- node.js - 如何为 Express 中间件在内存中缓存 .jpg?
- html - 为什么移动设备上的 Safari 需要这么长时间才能从内存中加载图像?
- java - 使用基于用户登录的缓存键
- javascript - 功能:错误 stackTraceLimit:10 - JavaScript、Google AppScript
- c# - 我读到你不能离开 Teams 去处理核心和非核心场景
- laravel - 如何使用 Laravel 和 Tailwind CSS 创建下拉导航
- git - 将多个 Git 差异显示为单个统一差异