C语言中的DLL(绝对)基础知识

时间:2014-01-17 00:40:35

标签: c dll

我一直想学习如何操纵.DLL。我正在寻找教程,但我找不到一个可以逐行向我解释的东西。如果我有可能找到一些东西,它就不会在C中(我正在寻找C tuts。而不是C ++。)

1 个答案:

答案 0 :(得分:1)

我将以一般方式解释他们如何在这里工作。对于整个故事,请从MSDN documentation of DLLs开始。另请阅读C编译器的文档,以获取有关如何创建和使用它们的特定详细信息。当您遇到问题时,请在SO处提出具体问题并提供支持代码,以便我们提供更多帮助。

在最简单的级别(并故意省略细节),DLL是一组函数,可以在运行时使用LoadLibrary()加载到进程的内存空间中,然后由进程调用。

DLL文件本身的格式与普通的Windows可执行文件类似,但它没有WinMainmain,因此在没有容器进程的情况下无法调用。所以它是使用链接器创建的,就像任何其他可执行文件一样。 (这是一个小谎言。实际上有一个名为DllMain()的入口点,但它用于高级功能,在加载和卸载DLL时调用,但仍然不允许直接调用DLL从命令提示符或CreateProcess()或类似的API调用“执行”。)

可以在运行时自动加载DLL。这是最常见的形式,并允许每个程序从单个通用副本加载C运行时库。为此,您只需将应用程序与正确的库和选项链接起来,系统就会负责加载DLL并修复指向它的所有符号。

DLL也可以在运行时加载。这通常是为了允许扩展现有应用程序。一个典型的例子是Windows屏幕保护程序。 .SCR文件实际上只是一个重命名的DLL,它导出某些提供屏幕保护程序功能的功能。窗口管理器查找在运行时配置的屏幕保护程序,将其.SCR文件作为DLL加载,并调用它提供的功能。

通过调用LoadLibrary()加载DLL,然后使用GetProcAddress()找到它包含的函数的地址。请注意,调用应用程序完全有责任知道如何调用该函数,并且有许多有趣的方法可能会出错。最明显的情况是必须提供DLL中函数所需的正确类型的预期参数数量。

发明COM的一个原因是提供一个框架,允许DLL描述它提供的功能,以及应用程序询问任何特定功能所期望的参数。 .NET框架提供了相同类型的内省功能,但在许多方面更成功。没有任何类型的保护可用(另一个谎言,它是,但在纯C中实现COM非常非常棘手)到普通的C程序和用简单C编写的DLL。