为什么要使用DLL

  使用DLL有若干理由,其中有一些前面提到过的。大体说来,使用动态链接库可以共享代码、系统资源,可以隐藏实现的代码或底层的系统例程、设计自定义控件

一、共享代码、资源和数据

  前面已经提到,共享代码是创建动态链接库的主要目的所在。但与单元的代码共享不同,DLL的代码可以被任何Windows 应用程序共享,而单元代码的工现象局限于Delphi应用程序

  另外,DLL提供了共享资源的途径,诸如 位图、字体、图标等等这些都可以放到一个资源文件中,并直接链接到应用程序。如果把这些资源放到DLL中,那么就可以让许多引用程序使用,而不必在内存中重复装入这些资源。

  在16位的Windows 中,DLL有自己的数据段,于是,所有要调用同一个DLL的应用程序能够访问同一个全局变量和静态变量。但是在Win 32系统中,这就不同了。因为DLL的映像被映射到每个进程的地址空间,该DLL的所有数据属于映射到的进程。值得一说的是,尽管进程间不能共享DLL的数据,但是同一个进程的所有线程可以共享,因为线程是相互独立的,所以在访问某一DLL的全局变量时,务必小心,防止引起冲突

  但是这并不意味着没有办法实现在进程间共享一个DLL的数据。一个技术可以通过内存映射文件的方法在内存中创建一个共享的区域。一切需调用DLL的应用程序都可以读这些存储在内存中的共享区域中的数据

二、隐藏实现的细节

  有时候,你可能想隐藏例程实现的细节,DLL就可以实现这一点,不管为什么要隐藏你的代码,DLL可以使函数被应用程序访问,而其中的代码细节不被显现,你所要做的只是提供别人能访问DLL的接口。你也许认为Delphi的便于单元(DCU)也可以实现隐藏细节,但是DCU只适用于Delphi应用程序,而且还受版本的局限。而DLL与语言无关,所以,创建的DLL可以被C++、VB或者其他支持DLL的语言调用。

  Windows单元是Win32 DLL的接口单元。Delphi 5提供了Win32 API的源文件,其一是Windows单元的源文件windows.pas,在该文件的interface部分有如下的定义

function ClientToScreen(Hwnd: HWND; var lpPoint: TPoint): BOOL; stdcall;

  为连接到相应的DLL,在其implementation部分,有如下的例子

function ClientToScreen; external user32 name ‘ClientToScreen‘;

  这行代码的意思表明,ClientToScreen() 在动态链接库 User32.dll中,它的名称叫 ClientToScreen

三、自定义控件

  自定义控件通常放在DLL中。这些控件不同于Delphi的自定义组件。自定义控件是在Windows 下注册,并且可以在任何Windows开发环境中使用。将这些类型的自定义控件加进DLL中,是考虑到即使有多个应用程序要使用这些自定义控件,内存中也只有该控件的一份实例

  注意:其实将自定义控件加入到DLL这种机制已经过时,现在微软使用 OLE和ActiveX控件自定义控件已经很少见了

时间: 2024-10-17 14:37:00

为什么要使用DLL的相关文章

Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决

前天PHP7.0.0正式版发布了,有一些比较好的改进,官方也说速度比php5.6快了两倍,性能上有了很大提升,并且也发布了从php5.x向php7迁移的问题,所以今后php网站迁移后能够大幅度的提升网站性能,所以为了尝鲜我也去php官网下载了7.0的版本,通过命令行进行独立的测试,下载zip包后解压出来,下载后进入目录,将php.ini-development改为php.ini其余的参数暂时不用修改,然后在当前目录下新建test.php,输入简单的代码: 1 <?php 2 echo "H

win7 64位系统 PB连接oracle数据库出现“oracle library oci.dll could not be loaded”问题的解决方法

今天与大家分享一个自己的学习笔记,希望能给遇到同样问题的人带来帮助. 不知道大家在win7 64位系统下用 PB连接oracle数据库时,是否遇到过“oracle library oci.dll could not be loaded”问题. 今天,在win7 64位系统下用 PB连接oracle数据库时,一直出现上述错误,在百度上找了很久,都没有找到一个完整的解决方案,咨询了很多人,(他们都说是我的PB和oracle没装好,但我装的时候没出现任何问题,一切都很顺利,而且PB和oracle都能正

c#解决dll调用的问题

在做一个c#中间程序时,调用第三方的dll安装路径"Program Files" 和"Program Files (x86)"的问题,经过一段时间的研究,找到了下面的解决方案: 思路: 1.配置dll的加载路径 2.监控dll 3.dll加载失败判断操作系统位数(x86.x64) 4.动态加载dll 解决方案: 1.在config中添加dll引用配置: <runtime> <assemblyBinding xmlns="urn:schem

c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)

如果直接放在项目运行目录,例如bin/debug可以直接加载,但是这样比较乱. 如果在放debug里面的一个文件夹里面,有可能会报错“无法加载xxx.dll 找不到指定的模块”. 如果路径写成这样就会报错 framework/linphone 解决方法:将/ 改成"\" framework\linphone

PL/SQL developer 连接oracle数据库报错“initialization error could not load oci.dll”

声明:PL/SQL 版本:PL/SQL Developer 9.0.6 (http://files.allroundautomations.com/plsqldev906.exe) 报错提示如图: 原因:PL/SQL只对32位OS进行支持,解决方法是额外加载一个oci.dll文件 解决办法:1.下载OCI.DLL相关库文件.地址: (需注册Oracle账号) http://www.oracle.com/technetwork/topics/winsoft-085727.html ----->  

DLL引用摘录

最近使用DllImport,从网上google后发现,大部分内容都是相同,又从MSDN中搜集下,现将内容汇总,与大家分享. 大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢?答案是肯定的,大家可以通过C#中的DllImport直接调用这些功能. DllImport是System.Runtime.InteropServices命名空间下的一个属性

Unity使用DLL库

Unity3D 能够很方便的集成一些外部插件,以便调用现有的动态链接库.下面会介绍Unity中如何集成Dll的两种方法.1. 标准引用这里所使用的语言是C#. 1.1 新建C#类库项目,这里就不多介绍了. 1.2 项目建好后正常的编写代码 以上是一个简单的测试代码. 1.3 将项目属性 -> 应用程序 -> 目标框架:改为 .NET Framework 3.5或以下 .这一步很重要,因为Unity3D(当前的Unity3D版本是3.5版) 支持的 .Net 是3.5版. 如果选择的是4.0版会

用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法

问题: 在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行.双击提示: "无法启动此程序,因为计算机中丢失mfc100.dll 尝试重新安装该程序以解决此问题." 解决方案: 方案一 采用静态编译使用VS2010编译的程序在windowsxp中运行时,经常会出现找不到相关的DLL文件,我们可以使用静态编译的方法把这些运行依赖文件打包到*.exe中来,以减少对环境的依赖. 一般可以配置以下两项: 项目 -< **属性 -< 配置属性-<

LIB和DLL的区别与使用(转载)

转载自:http://www.cppblog.com/amazon/archive/2009/09/04/95318.html 共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library.共有两种链接方式:动态链接使用动态链接库,允许可执行模块(.dll文件或.e

DLL文件的引用

首先我们先要写一个DLL文件: 我先创建一个win32的DLL工程,在工程中添加了Math.h和Math.cpp文件,具体内容如下: Math.h: #pragma once #include "stdafx.h" #ifdef API_EXPORT #define DLL_EXPORT _declspec(dllexport) #else #define DLL_EXPORT _declspec(dllimport) #endif DLL_EXPORT int Add(int x,