Delphi中DLL的其他应用
http://blog.csdn.net/zhenghui1/article/details/6618273
1.DLL的入口函数和出口函数
在编写DLL时可以在DLL项目文件的begin..end之间加入DLL的进入口函数和出口函数,全局变量DLLProc是一个过程指针,指定入口/出口函数,初始值为nil,只需将自己的出入口函数赋值给它即可,自己的出入口函数必须传入一个DWord类型的参数。一下是出入口函数事件对应的用途。
DLL_PROCESS_ATTACH 在进程启动或调用LoadLibrary( )时,DLL映射到当前进程的地址空间。在这个事件期间,D L L初始化实例数据
DLL_PROCESS_DETACH DLL正从进程的地址空间分离出来,这也许是进程本身退出或调用了FreeLibrary( )。在该事件里,D L L也许没有初始化任何实例。
DLL_THREAD_ATTACH 进程创建了一个新线程。这时,系统会调用所有和这个进程相关联的DLL入口函数。这个调用在新线程的环境中进行,用于分配线程特定的数据
DLL_THREAD_DETACH 一个线程正在退出。在该事件里,DLL将释放线程特定的初始化数据
警告 调用TerminateThread()非正常终止线程时,没有调用DLL_THREAD_DETACH。
2.DLL中使用回调函数
回调函数一般被Win32DLL或其他DLL调用,而不是由应用程序调用。当调用回调函数时传递函数的地址。在DLL可以定义一种回调函数类型,然后将其做为导出函数的参数,实际应用程序调用DLL时需自己实现该回调函数类型,并传递实际类型参数。
案例一。
打开delphi新建一个dll,源码如下:
library DLLEntry;
uses
SysUtils,
Windows,
Dialogs,
Classes;
{$R *.res}
procedure DLLEntryPoint(dwReason:DWord); //入出口函数
begin
case dwReason of
DLL_Process_Attach:showmessage('Attaching to process');
DLL_PROCESS_DETACH:Showmessage('Detaching from process');
DLL_THREAD_ATTACH:MessageBeep(0);
DLL_THREAD_DETACH:MessageBeep(0);
end;
end;
begin
DllProc:=@DLLEntryPoint; //赋值给全局变量
DLLEntryPoint(DLL_PROCESS_ATTACH); //传DWord类型值
end.
调用dll,新建一个Delphi应用程序,在窗体上放置一个label和4个button控件。源码如下:
unit mainFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TTestThread=class(TThread) //定义线程
procedure Execute;override;
procedure SetCaptionData;
end;
TmainForm = class(TForm)
btnLoadLib: TButton;
btnFreeLib: TButton;
btnCreateThread: TButton;
btnFreeThread: TButton;
lblCount: TLabel;
procedure btnLoadLibClick(Sender: TObject);
procedure btnFreeLibClick(Sender: TObject);
procedure btnCreateThreadClick(Sender: TObject);
procedure btnFreeThreadClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
LibHandle:THandle;
TestThread:TTestThread;
Counter:Integer;
GoThread:Boolean;
public
{ Public declarations }
end;
var
mainForm: TmainForm;
implementation
{$R *.dfm}
procedure TTestThread.Execute(); //重写线程的Execute方法
begin
while mainForm.GoThread do
begin
Synchronize(SetCaptionData);
Inc(mainForm.Counter);
end;
end;
procedure TTestThread.SetCaptionData; //线程的异步方法修改label控件的caption
begin
mainForm.lblCount.Caption:=IntToStr(mainForm.Counter);
end;
procedure TmainForm.btnLoadLibClick(Sender: TObject); //载入dll
begin
if LibHandle=0 then
begin
LibHandle:=LoadLibrary('DLLEntry.dll');
if LibHandle=0 then
raise Exception.Create('Unable to Load DLL');
end
else
MessageDlg('Library already loaded',mtWarning,[mbOK],0);
end;
procedure TmainForm.btnFreeLibClick(Sender: TObject); //释放dll
begin
if not (LibHandle=0) then
begin
FreeLibrary(LibHandle);
LibHandle:=0;
end;
end;
procedure TmainForm.btnCreateThreadClick(Sender: TObject); //开启线程
begin
if TestThread=nil then
begin
GoThread:=True;
TestThread:=TTestThread.Create(False);
end;
end;
procedure TmainForm.btnFreeThreadClick(Sender: TObject); //释放线程
begin
if Assigned(TestThread) then
begin
GoThread:=False;
TestThread.Free;
TestThread:=nil;
Counter:=0;
end;
end;
procedure TmainForm.FormCreate(Sender: TObject); //初始化操作
begin
LibHandle:=0;
TestThread:=nil;
end;
end.
运行截图




新建一个dll,源码如下:
library StrSrchLib;
uses
SysUtils,
Windows;
{$R *.res}
type
TFoundStrProc=procedure (StrPos:PChar);stdcall; //定义过程类型
function SearchStr(ASrcStr,ASearchStr:PChar;AProc:TFarProc):Integer;stdcall; //字符串查找功能
var
FindStr:PChar;
begin
FindStr:=ASrcStr;
FindStr:=StrPos(FindStr,ASearchStr); //查找ASearchStr在FindStr中出现位置
while FindStr<>nil do
begin
if AProc<>nil then
TFoundStrProc(AProc)(FindStr); //强制类型转换,将FindStr作为参数
FindStr:=FindStr+1;
FindStr:=StrPos(FindStr,ASearchStr); //循环查找
end;
end;
exports
SearchStr;
begin
end.
新建Delphi应用程序,在窗体上放置一个edit 一个memo和一个button控件,源代码如下:
unit CallTest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMainForm = class(TForm)
btnCallDLLFunc: TButton;
lblSrchWrd: TLabel;
mmoStr: TMemo;
edtSearchStr: TEdit;
procedure btnCallDLLFuncClick(Sender: TObject);
end;
var
MainForm: TMainForm;
count:integer; //全局计数变量
implementation
{$R *.dfm}
function SearchStr(ASrcStr,ASearchStr:PChar;AProc:TFarProc):Integer;stdcall;external 'StrSrchLib.dll'; //声明导入函数
procedure StrPosProc(AStrPsn:PChar);stdcall; //具体的回调函数类型
begin
inc(count);
end;
procedure TMainForm.btnCallDLLFuncClick(Sender: TObject);
var
s,s2:string;
begin
count:=0;
SetLength(s,mmoStr.GetTextLen);
mmoStr.GetTextBuf(PChar(s),mmoStr.GetTextLen); //这两句功能是将memo控件内容赋值给s字符串
s2:=edtSearchStr.Text;
SearchStr(PChar(s),PChar(s2),@StrPosProc);
ShowMessageFmt('%s %s %d %s',[edtSearchStr.Text,'occurs',count,'times.']);
end;
end.

DLL还有其他许多功能,在此不在一一列举,源码参考了delphi5编程指南,在Delphi7下编译运行通过,关于DLL还需在项目中更多应用才可熟能生巧。
Delphi中DLL的其他应用的更多相关文章
- Delphi中DLL的创建和使用(转)
Delphi中DLL的创建和使用 1.DLL简介: 2.调用DLL: 3.创建DLL: 4.两个技巧: 5.初始化: 6.例外处理. 1.DLL简介 ...
- Delphi中DLL的创建和使用
参考:http://blog.csdn.net/ninetowns2008/article/details/6311663 结合这篇博客:http://www.cnblogs.com/xumenger ...
- delphi中DLL编程详解
10.1 Windows的动态链接库原理 动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的.所有的C语言标准库函数都存放在某一函数库中,同时用户也可以用LIB程序创建自己的函 ...
- delphi 中DLL的建立
Dll的创建与调用 File ->New->Other->Dll Wizard DLL的创建 //可以将本代码复制粘贴到项目中 library Project1; uses S ...
- Delphi中DLL初始化和退出处理
来自delphibbs: zhousy_2000, 时间: 2005-09-13 13:53:00, ID: 3203484 <1>利用Unit的Initalization与Finaliz ...
- [转]Delphi 中动态链接库(dll)的建立和使用
动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...
- Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)
Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...
- 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)
Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...
- Delphi中编写无输出函数名的DLL文件(有点意思)(400多篇博客)
用 Delphi 用长了,总是发现,有些和 MS 不同的地方.例如,MS 的公开库中,常常隐藏了许多重要函数,这些函数在系统中常常有起着非常巨大的作用.一旦知道如何调用,可以给自己的应用程序提供很强的 ...
随机推荐
- android 开发adb server is out of date 解决方案
查看到底是哪个端口给占用了 输入红色部分命令 C:\Users\xxxxxx>netstat -ano | findstr "5037" TCP 127.0.0.1:5 ...
- activiti集成spring异常(DbSqlSession)
在eclipse配置一个简单的activiti项目,配置的是mysql数据库,报错如下: SLF4J: Failed to load class "org.slf4j.impl.Static ...
- C#中使用正则表达式提取超链接地址的集中方法(转)
一般在做爬虫或者CMS的时候经常需要提取 href链接或者是src地址.此时可以使用正则表达式轻松完成. Regex reg = new Regex(@"(?is)<a[^>]* ...
- GridView 根据要求显示指定值
最近在写一个小项目用来练手恢复一下功力的,在Users表中有一个用户字段是状态,我使用"0"表示启用,“1”表示禁用, 存到数据库中, 由于之前有一段时间没写代码了,所以有点生疏了 ...
- 了解实时媒体的播放(RTP/RTCP 和 RTSP)
http://blog.csdn.net/span76/article/details/12913307 RTP/RTCP RTP是基于 UDP协议的, UDP不用建立连接,效率更高:但允许丢包, 这 ...
- Django单元测试(一)
Django测试框架非常简单,首选方法是使用python标准库中的unittest模块. Writing tests Django的单元测试使用python的unittest模块,这个模块使用基于类的 ...
- 开发完整的Web项目必备
开发工具 数据库系统 DB2数据库 Oracle数据库 SQL Server数据库 MySQL数据库 Access数据库 Web服务器 IIS BEA WebLogic Server Apache T ...
- BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4326 给出一棵带有边权的树,以及一系列任务,任务是从树上的u点走到v点,代价为u到v路径上的权 ...
- [转]NHibernate之旅(12):初探延迟加载机制
本节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这 ...
- 【HTML】Beginner7:Image
1.Image The web is not just about text,it is a multi-media extravaganza and the most common form ...