【问题标题】:dynamic linking and load time linking .DLL动态链接和加载时链接.DLL
【发布时间】:2013-07-07 15:44:20
【问题描述】:

假设我制作了一个新的标准 API。这个 API 由一堆 C 头文件组成,但没有实现。特定供应商负责实现我的接口,以便应用程序开发人员可以与他们的产品进行交互。使用接口的原因很简单:应用程序开发人员应该能够毫无困难地与不同的产品交互,因为所有产品都实现了我的接口。

好的。现在到困难的事情上。实施我的 API 的供应商将如何实施 C 代码?我对这个问题的假设是,供应商会简单地将我的头文件包含在他们的项目中,并创建一个“导出”他们的实现函数的 .DLL。更重要的是,想要与我的 API 交互(但希望它与任何供应商的任何实现一起工作)的应用程序开发人员将如何编写他们的代码来利用这一点?

我阅读了this SO post 关于动态与加载时间链接的信息。如果您知道要链接到的 .dll 的名称并且知道要在该 .dll 中调用的函数,则加载时间链接似乎很有用。但是,在我的场景中,应用程序开发人员是否不必动态链接到实现我的 API 中的功能的 .dll ?该应用程序开发人员如何知道实现我的 API 中的功能的 .dll 的名称是什么?

我希望我的困惑是有道理的。我来自学习如何用 C 编程的背景,但我们并没有在这些东西上做太多事情。根据我的回忆,我们编写了一堆头文件和 C 文件,然后我们对其进行编译和链接……它产生了一个可执行文件,其中包含该可执行文件中的所有代码。请帮助澄清我的误解。

【问题讨论】:

    标签: c dll


    【解决方案1】:

    如您所说,您定义 API 并将其作为一个或多个头文件分发。

    您的宿主应用程序必须支持某种插件文件,可以是纯文本文件、xml、json 等,用户可以在其中添加第三方 dll 的名称。

    第三方包含你的头文件,实现和导出所需的功能。

    您的应用使用 LoadLibrary 动态加载插件文件中列出的每个第三方 dll,并调用 GetProcAddress 以发现入口点。

    您可能会考虑编写一个参考插件 dll,将其与源代码一起分发给第三方,以便他们可以将其用作样板,以实现有希望的工作实现。

    【讨论】:

      【解决方案2】:

      此应用程序开发人员如何知道实现我的 API 中的功能的 .dll 的名称是什么?

      最简单的解决方案是选择一个固定的名称(例如MyInterface.dll)并要求您接口的所有实现者使用该名称命名他们的 DLL。然后,程序可以尝试加载具有该名称的 DLL。

      如果您想要更大的灵活性,那么应用程序需要更复杂。例如,您可以在配置文件中指定 DLL 名称。然后应用程序将读入您的配置文件,获取 DLL 的名称,使用LoadLibrary() 加载它,并使用GetProcAddress() 加载任何需要的函数。

      如果您希望能够同时加载同一接口的多个实现,那么显然它们必须具有单独的文件名。这通常由加载 DLL 插件的程序完成。这样做的常用方法是枚举给定目录中与给定文件名模式匹配的所有 DLL,例如与FindFirstFile()/FindNextFile()。对于找到的每个 DLL,再次调用 LoadLibrary()GetProcAddress() 以访问每个 DLL 中的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        相关资源
        最近更新 更多