最新日志

发表于:2007-7-28 16:52:04
标签:pwm  

3

PWM技术

        脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
        简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM 进行编码。
        PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。
       对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。
      PWM控制技术一直是变频技术的核心技术之一。1964年A.Schonung和H.stemmler首先提出把这项通讯技术应用到交流传动中,从此为交流传动的推广应用开辟了新的局面。
从最初采用模拟电路完成三角调制波和参考正弦波比较,产生正弦脉宽调制SPWM信号以控制功率器件的开关开始,到目前采用全数字化方案,完成优化的实时在线的PWM信号输出,可以说直到目前为止,PWM在各种应用场合仍在主导地位,并一直是人们研究的热点。
        由于PWM可以同时实现变频变压反抑制谐波的特点。由此在交流传动及至其它能量变换系统中得到广泛应用。PWM控制技术大致可以为为三类,正弦PWM(包括电压,电流或磁通的正弦为目标的各种PWM方案,多重PWM也应归于此类),优化PWM及随机PWM。正弦PWM已为人们所熟知,而旨在改善输出电压、电流波形,降低电源系统谐波的多重PWM技术在大功率变频器中有其独特的优势(如ABB  ACS1000系列和美国ROBICON公司的完美无谐波系列等);而优化PWM所追求的则是实现电流谐波畸变率(THD)最小,电压利用率最高,效率最优,及转矩脉动最小以及其它特定优化目标。
在70年代开始至80年代初,由于当时大功率晶体管主要为双极性达林顿三极管,载波频率一般最高不超过5kHz,电机绕组的电磁噪音及谐波引起的振动引起人们的关注。为求得改善,随机PWM方法应运而生。其原理是随机改变开关频率使电机电磁噪音近似为限带白噪音(在线性频率坐标系中,各频率能量分布是均匀的),尽管噪音的总分贝数未变,但以固定开关频率为特征的有色噪音强度大大削弱。正因为如此,即使在IGBT已被广泛应用的今天,对于载波频率必须限制在较低频率的场合,随机PWM仍然有其特殊的价值(DTC控制即为一例);别一方面则告诉人们消除机械和电磁噪音的最佳方法不是盲目地提高工作频率,因为随机PWM技术提供了一个分析、解决问题的全新思路。

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(1370)
发表于:2007-4-21 11:49:12
标签:ShellExecute  

0

ShellExecute的使用

        有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。CreateProcess因为使用复杂,比较少用。 

WinExec主要运行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW); 
ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。
首先必须引用shellapi.pas单元:uses ShellAPI; 

1.标准用法 
  ShellExecute函数原型及参数含义如下: 
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall; 
  ●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即 Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。 
   ●Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作“open”。 
  ●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。 
  ●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。 
  ●Directory:用于指定默认目录。 
  ●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。 
  若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。 
  上述仅仅是ShellExecute函数的标准用法,下面将介绍它的特殊用法。 

2.特殊用法 
  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。 
  格式一:http://网站域名。 
  如:ShellExecute(handle, ‘open’, http:// ; 
www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL); 
  格式二:http://网站域名/网页文件名。 
  如:ShellExecute(handle, ‘open’, http:// ; 
www.neu.edu.cn/default.htm’,nil,nil,  SW_SHOWNORMAL); 
  如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括 Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据 Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。 
  格式一:mailto: 
  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口。 
  格式二:mailto:用户账号@邮件服务器地址 
  如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil,  SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。 
  格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文 
  如: ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject= Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。 
例子(delphi): 
在一个应用程序调用c:Project1.exe; 
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串内容’,nil, SW_SHOWNORMAL); 
在Project1.exe里可以调用: 
procedure TForm1.FormCreate(Sender: TObject); 
var i:integer; 
begin 
for i:=1 to paramcount do 
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i)); 
end;

最后的那个参数,为窗口指定可视性方面的一个命令。 
请用下述任何一个常数 
SW_HIDE 隐藏窗口,活动状态给令一个窗口 
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
SW_SHOWMAXIMIZED 最大化窗口,并将其激活 
SW_SHOWMINIMIZED 最小化窗口,并将其激活 
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
SW_SHOWNORMAL 与SW_RESTORE相同.

始一个新的应用程序
   ShellExecute(Handle, 'open', PChar('c:\test\app.exe'), nil, nil, SW_SHOW);

打开记事本,并打开一个文件(系统能识别记事本应用程序的路径,因此我们不必使用绝对路径)
   ShellExecute(Handle, 'open', PChar('notepad'), PChar('c:\test\readme.txt'), nil, SW_SHOW);

打印一个文档
   ShellExecute(Handle, 'print', PChar('c:\test\test.doc'), nil, nil, SW_SHOW);

   注意:可能你会看到word暂时的被打开,但它会自动关闭。

打开一个HTML页面
   ShellExecute(Handle, 'open', PChar('http://bbs.e-0631.cn'), nil, nil, SW_SHOW);

你能通过一个已经注册的文件类型来打开应用程序
   ShellExecute(Handle, 'open', PChar('c:\test\readme.txt'), nil, nil, SW_SHOW);

用windows Explorer 打开一个目录
   ShellExecute(Handle, 'explore', PChar('c:\windows)', nil, nil, SW_SHOW);

运行一个DOS命令并立即返回
   ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c copy file1.txt file2.txt'), nil, SW_SHOW);

运行一个DOS命令并保持DOS窗口存在
   ShellExecute(Handle, 'open', PChar('command.com'), PChar('/k dir'), nil, SW_SHOW);

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类:    |    来源: 整理

评论(0) | 阅读(826)
发表于:2007-4-19 22:48:40
标签:互联网  

0

Web2.0的几个基本概念——Blog、TAG、SNS、RSS、Wiki

★博客Blog
Blog是个人或群体以时间顺序所作的一种记录,且不断更新。Blog之间的交流主要是通过反向引用(TrackBack)和留言/评论(Comment)的方式来进行的。Blog的作者(Blogger),既是这个Blog的创作人,也是其档案管理人 。

★维客wiki、维基百科Wikipedia
维客WikiWiki一词来源于夏威夷语的“weekeeweekee”,是“快点快点”(quick,quick)的意思。 Wiki一种超文本系统,这种超文本系统支持面向社群的协作式写作。使用者可以在Web的基础上对Wiki文本进行浏览、创建、更改。Wiki的写作者自然构成了一个社群,Wiki系统为这个社群提供简单的交流工具。

★RSS聚合新闻
RSS是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容),通常被用于新闻和其他按顺序排列的网站。用于共享新闻和其他Web 内容的数据交换规范。读者可以通过RSS 订阅一个Blog,确知该Blog最近的更新。

★SNS
Social Networking Service(简称SNS,社会化网络软件)是Web 2.0体系下的一个技术应用架构。SNS基于六度分隔理论运作,这个理论的通俗解释是:“在人脉网络中,要结识任何一位陌生的朋友,中间最多只要通过六个朋友就可以达到目的。”放在Web 2.0的背景下,每个用户都拥有自己的Blog、自己维护的Wiki、社会化书签或者Podcast,用户通过Tag 、RSS或者IM、邮件等方式连接到一起,“按照六度分隔理论,每个个体的社交圈都不断放大,最后成为一个大型网络,这就是社会化网络(SNS)。”

★Tag
Tag (标签)是一种更为灵活、有趣的日志分类方式,您可以为每篇日志添加一个或多个Tag(标签),然后您可以看到BlogBus上所有和您使用了相同Tag 的日志,并且由此和其他用户产生更多的联系和沟通。不仅如此,我们还通过与Technorati的合作,把您的Tag发送到全球Blog空间,和全世界的人们共同分享。

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(705)
发表于:2007-4-18 14:54:32
标签:I2C  

2

I2C简介

I2C(InterIntegrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设 备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系 统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。


1 I2C
总线特点
I2C
总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联 成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控 (multimastering) 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

 
2 I2C
总线工作原理
2.1
总线的构成及信号类型
I2C
总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、ICIC之间进行双向传送,最高传送速率 100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程 中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制 量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂 在同一条总线上,却彼此独立,互不相关。
I2C
总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单 元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
目前有很多半导体集成电路上都集成了I2C接口。带有I2C接口的单片机有:CYGNAL C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIPPIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I2C接口。


3
总线基本操作
I2C
规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低 电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。

3.1
控制字节
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作

3.2
写操作
写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。关于页面写的地址、应答和数据传送的时序

3.3
读操作
读操作有三种基本操作:当前地址读、随机读和顺序读。图4给出的是顺序读的时序图。应当注意的是:最后一个读操作的第9个时钟周期不是不关心。为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 整理

评论(0) | 阅读(994)
发表于:2007-4-15 16:01:59
标签:DLL  

0

什么是DLL?

什么是 DLL

概要

本文说明什么是动态链接库 (DLL) 以及在使用 DLL 时可能发生的各种问题。

然后,本文说明在开发您自己的 DLL 时应该考虑的一些高级问题。在说明什么是 DLL 的过程中,本文将说明动态链接方法、DLL 依赖性、DLL 入口点、导出 DLL 函数以及 DLL 故障排除工具。

本文最后将从较高的层次对 DLL Microsoft .NET Framework 程序集作一比较。

简介

对 于适用于一节中列出的 Microsoft Windows 操作系统,操作系统的大量功能是由动态链接库 (DLL) 提供的。另外,当您在这些 Windows 操作系统之一上运行某一程序时,该程序的很多功能可能是由 DLL 提供的。例如,某些程序可能包含很多不同的模块,而该程序的每个模块都包含在 DLL 中并从中分发。

使用 DLL 有助于促进代码的模块化、代码重用、内存的有效使用和减少所占用的磁盘空间。因此,操作系统和程序能够更快地加载和运行,并且在计算机中占用较少的磁盘空间。

当程序使用 DLL 时,一个称为依赖性的问题可能导致该程序无法运行。当程序使用 DLL 时,就会创建一个依赖项。如果其他程序改写和损坏了该依赖项,原来的那个程序就可能无法成功运行。

在引入 Microsoft .NET Framework 之后,大多数依赖性问题都已经通过使用程序集消除了。

更多信息

什么是 DLL

DLL 是一个包含可由多个程序同时使用的代码和数据的库。例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现打开对话框。这有助于促进代码重用和内存的有效使用。

通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。下表说明了 Windows 操作系统中的一些作为 DLL 实现的文件:

ActiveX 控件 (.ocx) 文件
ActiveX
控件的一个示例是日历控件,它使您可以从日历中选择日期。

控制面板 (.cpl) 文件
.cpl
文件的一个示例是位于控制面板中的项。每个项都是一个专用 DLL

设备驱动程序 (.drv) 文件
设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序。

DLL 的优点

下表说明了当程序使用 DLL 时提供的一些优点:

使用较少的资源
当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。

推广模块式体系结构
DLL
有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。

简化部署和安装
DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。

DLL 依赖项

当某个程序或 DLL 使用其他 DLL 中的 DLL 函数时,就会创建依赖项。因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。例如,如果发生下列操作之一,则该程序可能无法运行:

依赖 DLL 升级到新版本。

修复了依赖 DLL

依赖 DLL 被其早期版本覆盖。

从计算机中删除了依赖 DLL

这些操作通常称为 DLL 冲突。如果没有强制实现向后兼容性,则该程序可能无法成功运行。

下表说明了为了帮助最大限度地减少依赖性问题而在 Microsoft Windows 2000 和较高版本的 Windows 操作系统中引入的更改:

Windows 文件保护
Windows 文件保护中,操作系统禁止未经授权的代理更新或删除系统 DLL。因此,当程序安装操作尝试删除或更新被定义为系统 DLL DLL 时,Windows 文件保护将寻找有效的数字签名。

专用 DLL
通 过专用 DLL 可以使程序避免遭受对共享 DLL 进行的更改。专用 DLL 使用版本特定信息或空 .local 文件来强制要求程序所使用的 DLL 的版本。要使用专用 DLL,请在程序根文件夹中查找 DLL。然后,对于新程序,请向该 DLL 中添加版本特定信息。对于旧程序,请使用空 .local 文件。每个方法都告诉操作系统使用位于程序根文件夹中的专用 DLL

DLL 故障排除工具

可以使用多个工具来帮助您解决 DLL 问题。以下是其中的部分工具。

Dependency Walker

Dependency Walker 工具可以递归扫描以寻找程序所使用的所有依赖 DLL。当您在 Dependency Walker 中打开程序时,Dependency Walker 会执行下列检查:

Dependency Walker 检查是否丢失 DLL

Dependency Walker 检查是否存在无效的程序文件或 DLL

Dependency Walker 检查导入函数和导出函数是否匹配。

Dependency Walker 检查是否存在循环依赖性错误。

Dependency Walker 检查是否存在由于针对另一不同操作系统而无效的模块。

通过使用 Dependency Walker,您可以记录程序使用的所有 DLL。这可能有助于避免和更正将来可能发生的 DLL 问题。当您安装 Microsoft Visual Studio 6.0 时,Dependency Walker 将位于以下目录中:

drive\Program Files\Microsoft Visual Studio\Common\Tools

DLL Universal Problem Solver

DLL Universal Problem Solver (DUPS) 工具用于审核、比较、记录和显示 DLL 信息。下表说明了组成 DUPS 工具的实用工具:

Dlister.exe
该实用工具枚举计算机中的所有 DLL,并且将此信息记录到一个文本文件或数据库文件中。

Dcomp.exe
该实用工具比较在两个文本文件中列出的 DLL,并产生包含差异的第三个文本文件。

Dtxt2DB.exe
该实用工具将通过使用 Dlister.exe 实用工具和 Dcomp.exe 实用工具创建的文本文件加载到 dllHell 数据库中。

DlgDtxt2DB.exe
该实用工具提供 Dtxt2DB.exe 实用工具的图形用户界面 (GUI) 版本。

有关 DUPS 工具的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

247957 (http://support.microsoft.com/kb/247957/) 示例:使用 DUPS.exe 解决 DLL 兼容性问题

DLL 帮助数据库

DLL 帮助数据库帮助您查找由 Microsoft 软件产品安装的特定版本的 DLL。有关 DLL 帮助数据库的更多信息,请访问下面的 Microsoft 网站:

http://support.microsoft.com/dllhelp/ (http://support.microsoft.com/dllhelp/)

DLL 开发

本节介绍您在开发自己的 DLL 时应该考虑的问题和要求。

DLL 的类型

当您在应用程序中加载 DLL 时,可以使用两种链接方法来调用导出的 DLL 函数。这两种链接方法是加载时动态链接运行时动态链接

加载时动态链接

在 加载时动态链接中,应用程序像调用本地函数一样对导出的 DLL 函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件 (.h) 和导入库文件 (.lib)。当您这样做时,链接器将向系统提供加载 DLL 所需的信息,并在加载时解析导出的 DLL 函数的位置。

运行时动态链接

在运行时动态链接中,应用程序调用 LoadLibrary 函数或 LoadLibraryEx 函数以在运行时加载 DLL。成功加载 DLL 后,可以使用 GetProcAddress 函数获得要调用的导出的 DLL 函数的地址。在使用运行时动态链接时,无需使用导入库文件。

下面的列表说明了有关何时使用加载时动态链接以及何时使用运行时动态链接的应用程序条件:

启动性能
如果应用程序的初始启动性能很重要,则应使用运行时动态链接。

易用性
在加载时动态链接中,导出的 DLL 函数类似于本地函数。这使您可以方便地调用这些函数。

应用程序逻辑
在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。在开发多语言版本时,这一点很重要。

DLL 入口点

在 创建 DLL 时,可以有选择地指定入口点函数。当进程或线程将它们自身附加到 DLL 或者将它们自身从 DLL 分离时,将调用入口点函数。您可以使用入口点函数根据 DLL 的需要来初始化数据结构或者销毁数据结构。此外,如果应用程序是多线程的,则可以在入口点函数中使用线程本地存储 (TLS) 来分配各个线程专用的内存。下面的代码是一个 DLL 入口点函数的示例。

BOOL APIENTRY DllMain(

HANDLE hModule, // Handle to DLL module

        DWORD ul_reason_for_call,      // Reason for calling function

        LPVOID lpReserved ) // Reserved

{

        switch ( ul_reason_for_call )

        {

               case DLL_PROCESS_ATTACHED:

               // A process is loading the DLL.

               break;

               case DLL_THREAD_ATTACHED:

               // A process is creating a new thread.

               break;

               case DLL_THREAD_DETACH:

               // A thread exits normally.

               break;

               case DLL_PROCESS_DETACH:

               // A process unloads the DLL.

               break;

        }

        return TRUE;

}