dll文件怎么用 - 什么是DLL?





dll打开乱码 dll分析 (8)


动态链接库。

给你一个例子,如果你有其他人的DLL加载到你的应用程序中,你可以使用它的一些编程。

您可以加载一个生成总是以“5”开头的随机数的DLL。

在你的程序中,你可以调用CrazyDLL.GenerateRandomNumbersSorta(),它会返回数字。

对于一个真实世界的例子,我有一个组合了4个文本框的DLL(你可以使用它们来输入IP地址),它自动只接受小于256的数字,并处理按退格键跳转到上一个文本框。

我已经创建了一个包含该代码的DLL,现在我只需拖放更多的IP地址文本集合,而不必一遍又一遍地重复所有的代码。

同一个DLL还具有将IP地址转换为十六进制字符串的功能以及其他有用的代码。

这可能是一个很难理解的问题,但是在当今Web应用程序开发的世界中,许多程序员不需要处理dll的很多内容,因此也不必费心去了解它们的用途。

那么,什么是DLL?

  1. 它是干什么用的?
  2. 它是如何工作的?
  3. 你如何创建一个?
  4. 在什么情况下创建一个合适的?

我被告知dll被用来存储函数库,但除此之外我不太了解。 希望这里的某个人能够启发我,这样我就可以终止不知道我的Windows目录中的所有这些.dll文件在做什么。




DLL是一个动态链接库。 它是代码和/或数据的集合,可以被多个应用程序(或其他库/模块)使用。

因此,例如处理文件,使用GUI组件等常见方法在库中可用,因此多个应用程序可能使用相同的功能。 这不仅减少了多次构建相同内容的需求,而且还确保了例如应用程序之间的通用对话框相同。

库可以在运行时加载,并因此在不同的并发应用程序之间共享。 这被称为动态链接。

在某些情况下,库可以包含在应用程序本身中。 这被称为静态链接。 静态链接使得部署变得更加容易,代价是灵活性,因为不同的应用程序将分别加载相同的DLL副本。

但是,静态链接并不总是一种选择。 例如,你不能静态链接一个.NET应用程序。 用户必须拥有.NET库才能运行.NET应用程序,并在运行时加载库(或在.NET中调用的程序集)。

DLL是由用于创建应用程序的相同工具创建的。 具体细节很大程度上取决于所使用的工具。




DLL =动态加载链接库。 正如您所知,它基本上是一组函数,C ++类和/或全局变量。 您可以静态加载DLL(即,操作系统在程序启动时自动加载它)或动态加载(程序显式加载它),此时DLL中的函数和东西可用于您的程序。

创建一个类似于创建一个EXE,除了不需要是一个main()函数。 有链接器指令告诉链接器创建一个DLL而不是EXE。

你想要做到这一点的主要原因是将一些代码封装在一个地方,并从多个exe文件中使用它,而不是将代码链接到每个代码。

一个有点历史的原因是,你的exe可以更小,因为一些代码实际位于不同的文件中。 这意味着您的exe占用的内存空间可能会更小。 在现代系统上,这个问题不像以前那么严重,尽管它在Windows Mobile上仍然可能是个问题。




DLL =动态链接库

这个名字实际上完全描述了他们的成就。

图书馆

让您将特定问题域的代码隔离到单个位置。 然后在多个应用程序中共享这个。 该库可随时换成另一个来修复错误或添加功能。

链接

您可以将库“链接”到应用程序,以便库中的逻辑不会直接编译到应用程序中。

动态

该库可以按需加载。 OS不会将庞大的单个EXE加载到内存中,而只能加载所需的部分。 另外,如果应用程序之间共享DLL,操作系统可以优化库的加载方式并在应用程序之间共享。




来自MSDN Library

动态链接库(DLL)是一个模块,它包含可供其他模块(应用程序或DLL)使用的函数和数据。




DLL(动态链接库)文件可以被描述为小的“子程序”,这些子程序旨在帮助更大的程序运行良好。 它们提供了一种手段,以“根据需要”为基础,将各种硬件和软件资源(在其运行时会话中的各个点)链接到它们所基于的主要可执行程序。 当程序第一次运行时,这消除了在主计算机的RAM(随机存取存储器)上加载所有与主执行程序相关的操作。

由DLL携带的软件资源包括用于保持程序运行所不需要的各种程序功能的代码:即,在给定计算会话期间的特定时间仅需要调用的功能,甚至可能实际上甚至不需要被称为。 当程序第一次运行,然后在整个会话期间将它们保留在那里时,将这些功能(对于给定的程序可能有相当数量的这些功能)加载到计算机的RAM上会浪费RAM空间 - 这被认为是在溢价。

重大进步:

DLLs的开发是计算领域的一项重大进步,因为在它们可用之前,当程序第一次加载时,所有与程序有关的事情(包括很少使用过的函数)都必须加载到RAM中。 这导致了非常低效的计算,各种程序展现出较慢的速度。 通过运行几个简单的程序来完成多任务也非常困难,因为随之而来的内存紧张。

注意事项:

DLL通常是特定于版本的。 对于版本1(或可能是编程语言)而言,那些适用于版本2的版本可能不适用于版本2.一般规则是旧版本中的DLL往往无法工作以及较新的版本,但是较新版本的程序或编程语言通常可以很好地工作。




维基百科页面上的DLL几乎包含了你想要的所有信息。

动态链接库(也可以不带连字符编写)或DLL是微软在Microsoft Windows和OS / 2操作系统中实现共享库的概念。 这些库通常具有文件扩展名DLL,OCX(用于包含ActiveX控件的库)或DRV(用于传统系统驱动程序)。 DLL的文件格式与Windows EXE文件相同 - 即32位和64位Windows的可移植可执行文件(PE),以及16位Windows的新可执行文件(NE)。 和EXE一样,DLL可以以任意组合包含代码,数据和资源。 从广义上讲,任何具有相同文件格式的数据文件都可以称为资源DLL。




[编辑:当我写这一切时,PauliusMaruška编辑他的评论基本相同。 对任何重复都表示歉意。 虽然我想你现在有一个备用:)]

在我的头顶,并假设Visual C ++ ...

您需要使用LoadLibrary动态加载DLL,然后使用GetProcAddress从中检索将创建DLL代码实现的实际派生类的函数的地址。 你决定如何精确地做到这一点取决于你(DLL需要查找,暴露其功能需要指定的方式等)所以现在让我们假设插件只提供新的Sprite实现。

为此,请确定DLL中函数的签名,主程序将调用该函数来创建这些新精灵中的一个。 这个看起来合适:

typedef Sprite *(*CreateSpriteFn)();

然后,从主程序,你将不得不加载DLL(再次,你如何找到这个DLL取决于你)并从中获取精灵创建功能。 我已经决定将精灵创建函数称为“CreateSprite”:

HMODULE hDLL=LoadLibrary(pDLLName);
CreateSpriteFn pfnCreateSprite=CreateSpriteFn(GetProcAddress(hDLL,"CreateSprite"));

然后实际创建其中一个,只需调用函数:

Sprite *pSprite=(*pfnCreateSprite)();

一旦你完成了DLL并且没有剩下的对象被它创建,你就可以使用FreeLibrary来摆脱它了:

FreeLibrary(hDLL);

要创建体育此接口的DLL,请编写派生类的代码,依此类推,然后在DLL代码中的某处使用适当的签名提供调用程序所需的CreateSprite函数:

__declspec(dllexport)
extern "C"
Sprite *CreateSprite()
{
    return new MyNewSprite;
}

dllexport的意思是你可以使用GetProcAddress按名称选择这个函数,extern“C”确保名称是unmangled并且不会以“CreateSprite @ 4”或类似的方式结束。

另外两个说明:

  1. 如果GetProcAddress找不到该函数,则返回0,因此您可以使用它来扫描DLL列表(例如,从FindFirstFile和朋友返回),查找支持该接口的DLL,和/或尝试查找多个入口点并支持每个插件多种类型。
  2. 如果主程序要使用delete运算符删除sprite,则需要使用相同的运行时库构建DLL和主程序,以便主程序的delete和DLL的新程序都使用相同的堆。 你可以通过让DLL提供一个DeleteSprite函数来解决这个问题,这个函数使用DLL的运行时库而不是主程序删除精灵,但是你仍然需要关心程序的其余部分,所以你可能只是想强制DLL编写器使用与程序相同的运行时库。 (我不会说你这样做会很好,但这并不罕见。例如,3D Studio MAX需要这个。)




dll