动态链接和加载时间链接.DLL

时间:2013-07-09 21:13:18

标签: c dll

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

确定。现在到了硬的东西。如何实现我的API的供应商实现C代码?我对这个问题的假设是,供应商只需在我们的项目中包含我的头文件,并创建一个“导出”其实现功能的.DLL。更重要的是,想要与我的API交互(但希望它与任何供应商的任何实现一起工作)的应用程序开发人员如何编写他们的代码以利用这一点?

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

我希望我的困惑是有道理的。我来自一个背景,在那里我学习了如何用C语言编程,但是我们对这些东西做的并不多。从我的回忆中,我们编写了一堆头文件和C文件,然后我们编译并链接它......它导致了一个可执行文件,其中包含该可执行文件中的所有代码。请帮助澄清我的误解。

2 个答案:

答案 0 :(得分:3)

  

这个应用程序开发人员如何知道实现我的API函数的.dll名称是什么?

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

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

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

答案 1 :(得分:2)

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

您的主机应用必须支持某种插件文件,该文件可以是纯文本文件,xml,json等等,用户可以将第三方dll的名称添加到。

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

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

您可以考虑编写一个参考插件dll,并使用源代码将其分发给第三方,以便他们可以将其用作希望正常工作的样板。