2013-07-25 21 views
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(); 

this conversation它表示:

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

我的问题是如何做这个作者建议什么时候我要导入各种各样的函数,并带有各种签名。使用已经在Python.h中的签名(包括那个头文件)会很好。

回答

1

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

该表方法的重大缺陷是,不可能将其与现有代码一起使用,该代码按名称调用函数(pPy_Initialize();) - 您必须使用表中的指针,可能通过枚举( pPy[Initialize]();)。

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

恕我直言,所有奇怪的机器超过宏的唯一重要优势是,你可能能够加载任意的DLL与它。除此之外,我不会走那条路。

+0

我同意你的最后一段,宏(或typedefs)似乎是要走的路,尽管你之前提出的建议可能有助于此代码的另一次迭代。对于其他读者:您可能会发现本文中来自MSDN的模式有用:[动态链接](http://msdn.microsoft.com/zh-cn/library/ms810279.aspx) – davidvandebunte