我的问题是要使用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中的签名(包括那个标题以某种方式)会很好。
答案 0 :(得分:1)
我会像系统链接器那样:构造一个包含所有函数名的符号表。然后只需初始化该表中的指针。函数名称可以是固定的字符串常量,也可以从DLL本身读取(即Win32 API to enumerate dll export functions?)。
然而,该表方法的显着缺点是不可能将它与现有代码一起使用,现有代码通过名称调用函数(pPy_Initialize();
) - 您必须使用表中的指针,可能已编入索引通过enum(pPy[Initialize]();
)。
可以使用不同的表(每个签名一个表)来处理不同的签名。签名也可以与某些符号形式的名称一起存储,然后你将它包装在一些可以解析和检查它的访问者魔法中 - 但这很快就会变得太复杂,就像发明另一种编程语言一样。 p>
恕我直言,奇怪的机器对宏的唯一重要优势是你可以用它加载任意的DLL。除此之外,我不会走那条路。