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的其他应用的更多相关文章

  1. Delphi中DLL的创建和使用(转)

    Delphi中DLL的创建和使用     1.DLL简介:   2.调用DLL:   3.创建DLL:   4.两个技巧:   5.初始化:   6.例外处理.            1.DLL简介  ...

  2. Delphi中DLL的创建和使用

    参考:http://blog.csdn.net/ninetowns2008/article/details/6311663 结合这篇博客:http://www.cnblogs.com/xumenger ...

  3. delphi中DLL编程详解

    10.1 Windows的动态链接库原理 动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的.所有的C语言标准库函数都存放在某一函数库中,同时用户也可以用LIB程序创建自己的函 ...

  4. delphi 中DLL的建立

    Dll的创建与调用   File ->New->Other->Dll Wizard  DLL的创建 //可以将本代码复制粘贴到项目中 library Project1; uses S ...

  5. Delphi中DLL初始化和退出处理

    来自delphibbs: zhousy_2000, 时间: 2005-09-13 13:53:00, ID: 3203484 <1>利用Unit的Initalization与Finaliz ...

  6. [转]Delphi 中动态链接库(dll)的建立和使用

    动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...

  7. Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)

    Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...

  8. 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)

    Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...

  9. Delphi中编写无输出函数名的DLL文件(有点意思)(400多篇博客)

    用 Delphi 用长了,总是发现,有些和 MS 不同的地方.例如,MS 的公开库中,常常隐藏了许多重要函数,这些函数在系统中常常有起着非常巨大的作用.一旦知道如何调用,可以给自己的应用程序提供很强的 ...

随机推荐

  1. 图片url中包含中文导致网络请求404

    需要对其中的中文使用转换格式,注意不是整个url,如果是整个,"/"这个网络分隔符`也会被转换的 URLEncoder.encode("福利", "u ...

  2. 做最好的自己(Be Your Personal Best)

    成功——做最好的自己 价值观——成功源于诚信 积极主动——成功的选择在于自己 同理心——人际交往的基础 自信——用信心放飞自我 自省——在反思中走向成功 勇气——勇往直前的精神 胸怀——海纳百川的境界 ...

  3. Java SE知识点

    Java概述 Java的运行机制 JDK,JRE,JVM Java开发环境搭建 用记事本编写运行一个Hello World的完整过程 如何在Java中使用注释 使用Eclipse开发Java程序 使用 ...

  4. Wordpress prettyPhoto插件跨站脚本漏洞

    漏洞名称: Wordpress prettyPhoto插件跨站脚本漏洞 CNNVD编号: CNNVD-201311-413 发布时间: 2013-11-28 更新时间: 2013-11-28 危害等级 ...

  5. ☀【window.self / window.parent / window.top】

    Js中的window.parent ,window.top,window.self 详解 √http://blog.csdn.net/zdwzzu2006/article/details/604763 ...

  6. Native Fullscreen JavaScript API (plus jQuery plugin)

    http://johndyer.name/native-fullscreen-javascript-api-plus-jquery-plugin/ HTML5 <video> is gre ...

  7. 【转】Android版本和API Level对应关系

    原文网址:http://blog.csdn.net/huiguixian/article/details/39928027 从Android developer copy过来,留作笔记的. Platf ...

  8. 【转】ubuntu11.10 64bit 环境android编译错误

    原文网址:http://blog.csdn.net/lmhgen/article/details/7326083 错误1: 注意:external/protobuf/java/src/main/jav ...

  9. POJ 1773 Parity game 带权并查集

    分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...

  10. [liu yanling]规范软件测试流程

    测试计划 做任何事情都会有输入输出,对于测试过程我们可以把输入理解为测试计划.测试环境准备.测试工具的选择等等,输出可以理解为测试结果.测试用例设计即可以理解为以测试计划为输入的输出,也可以理解为以测 ...