【问题标题】:Can a DLL call/load another DLL? [closed]DLL 可以调用/加载另一个 DLL 吗? [关闭]
【发布时间】:2010-12-06 20:18:55
【问题描述】:

我想从我自己的 DLL 中调用一些第三方 DLL 例程。我只是不确定如何在 C++ 中做到这一点。

【问题讨论】:

  • 当然。它是什么类型的 DLL?

标签: c++ windows dll


【解决方案1】:

您可以像在可执行文件中一样在 DLL 中使用 load-time dynamic linkingrun-time dynamic linking。唯一的限制是不要从 DllMain 函数中调用 LoadLibrary 以避免死锁。

【讨论】:

    【解决方案2】:

    LoadLibrary 和 GetProcAddress 是您的朋友之一......

    【讨论】:

      【解决方案3】:

      如果此 dll 有 .lib 文件,您只需将其添加到链接器输入并静态导入其功能。如果没有,有一些工具可以从 .dll 生成 .lib 文件。

      您还可以使用LoadLibraryGetProcAddress 动态导入函数。
      MSDN 说你不能从 DllMain 调用 LoadLibrary。但在大多数情况下,没有什么不好的事情发生。

      【讨论】:

        【解决方案4】:

        通常,您通过项目中的导出库链接到 DLL。然后,您的程序可以调用 DLL 函数,前提是 DLL 在运行时位于程序的路径中。

        通过手动加载 DLL 并获取所需的函数地址,也可以(但需要做更多工作)来避免所需函数的链接时解析,但如果第三方 DLL 支持通常的链接时间机制。

        【讨论】:

        • 导入库是合适的,只要在应用程序启动之前可以安全地假定 .dll 就在那里。否则它需要 LoadLibrary() 等。
        • @seand - 当然。不过,我认为 99% 的情况是链接到导出库并在运行时放置 DLL。取决于有问题的图书馆是否有这个,仅此而已。大多数写得很好的都是这样做的。
        • 不确定 99% 但可能是 80-90%。如果您链接到机器上可能不存在的 dll,则会出现此问题。 (如 mapi32.dll)。如果您链接为导入库,您的应用程序将在启动时呈现用户不友好的对话框。但是,如果您动态链接,您可以给出更友好的响应,并且可能以降级模式或其他方式运行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2017-06-07
        • 1970-01-01
        • 2011-08-12
        相关资源
        最近更新 更多