【问题标题】:Cleanly implementing run-time dynamic linking干净地实现运行时动态链接
【发布时间】:2013-07-25 23:37:14
【问题描述】:

我的问题将使用 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 中已经存在的签名(以某种方式包括该标头)。

【问题讨论】:

    标签: python c++ c winapi loadlibrary


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我同意您的最后一段,即宏(或 typedef)似乎是要走的路,尽管您之前的建议可能有助于此代码的另一次迭代。对于其他读者:您可能会发现这篇 MSDN 文章中的模式很有用:DLLs the Dynamic Way
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2023-03-29
    相关资源
    最近更新 更多