3

我的问题将使用 Python 中的示例,但这似乎是一个普遍的问题。

我一直在使用加载时动态链接,但由于各种原因(在下面的链接中推荐)我想动态加载 Python 库:

HINSTANCE hModPython = LoadLibrary(_T("Python27.dll"));

我可以Py_Initialize从 DLL 加载和其他功能,但这是一个肮脏的过程:

int (*pPy_Initialize)(void);
pPy_Initialize = (int (*)(void))GetProcAddress(hModPython, "Py_Initialize");
pPy_Initialize();

这次谈话中,有人说:

宏可以使使用这些指针对调用 Python 的 C API 中的例程的任何 C 代码透明。

我的问题实际上是当我要导入具有各种签名的各种函数时,如何执行作者建议的操作。最好使用 Python.h 中已经存在的签名(以某种方式包括该标头)。

4

1 回答 1

1

我会像系统链接器那样:构造一个包含所有函数名的符号表。然后只需初始化该表中的指针。函数名称可以是固定的字符串常量,也可以从 DLL 本身读取(即Win32 API 来枚举 dll 导出函数?)。

但是,该表方法的一个显着缺点是无法将其与现有代码一起使用,这些代码通过名称 ( pPy_Initialize();) 调用函数——您必须使用表中的指针,可能通过枚举 ( pPy[Initialize]();) 进行索引。

可以通过使用不同的表(每个签名一个表)来处理不同的签名。签名也可以与名称一起以某种符号形式存储,然后您将其包装在一些可以解析和检查它的访问器魔法中——但这很快就会变得过于复杂,就像发明另一种编程语言一样。

恕我直言,与宏相比,所有这些怪异机制的唯一显着优势是您可以使用它加载任意 DLL。除此之外,我不会走那条路。

于 2013-07-26T00:48:17.493 回答