0

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

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

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

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

4

2 回答 2

3

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

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

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

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

于 2013-07-09T21:20:59.967 回答
2

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

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

第三方包括您的标头,实现和导出所需的功能。

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

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

于 2013-07-09T21:21:19.867 回答