干净地实现运行时动态链接

时间:2013-07-25 23:37:15

标签: python c++ c winapi loadlibrary

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

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

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

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

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

this conversation中,它说:

  

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

我的问题是,当我要导入各种各样的签名功能时,我的问题是如何做这位作者所建议的。使用已经在Python.h中的签名(包括那个标题以某种方式)会很好。

1 个答案:

答案 0 :(得分:1)

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

然而,该表方法的显着缺点是不可能将它与现有代码一起使用,现有代码通过名称调用函数(pPy_Initialize();) - 您必须使用表中的指针,可能已编入索引通过enum(pPy[Initialize]();)。

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

恕我直言,奇怪的机器对宏的唯一重要优势是你可以用它加载任意的DLL。除此之外,我不会走那条路。