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. 李洪强漫谈iOS开发[C语言-035]-选择结构-与小结

  2. new[]上面居然有一个内存计数,怪不得delete[]从来不出错

    开眼界了,留个爪,以后再仔细看几遍: http://www.cnblogs.com/hazir/p/new_and_delete.html

  3. 156. Binary Tree Upside Down

    题目: Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node ...

  4. Android Service的生命周期

    service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的service通过其他组件调用 startService()被创建. 这种 ...

  5. 在redhat6.4下安装 Oracle® Database 11g Release 2

    OS版本: 安装过程的相关信息: pdksh 安装好后根据需要设置oracle开机自启动http://www.cnblogs.com/softidea/p/3761671.html 设置环境变量NLS ...

  6. 转:Web service是什么?

    作者: 阮一峰 我认为,下一代互联网软件将建立在Web service(也就是"云")的基础上. 我把学习笔记和学习心得,放到网志上,欢迎指正. 今天先写一个最基本的问题,Web ...

  7. C++ CGI Helloword

    一 什么是CGI CGI(The Common Gateway Interface):通用网关接口,定义web服务器和客户脚本进行信息交互的一系列标准.  二 web浏览器 为了了解CGI的概念,让我 ...

  8. java 写的能够响应浏览器请求的 http 服务器

    这只是一个小Demo,话几十分钟搞出来的. 不废话先上代码. 首先是服务端的 package com.cnryb; import java.io.IOException; import java.io ...

  9. HDU5673 Robot 默慈金数

    分析: 注:然后学了一发线性筛逆元的姿势 链接:http://blog.miskcoo.com/2014/09/linear-find-all-invert #include<iostream& ...

  10. Esper系列(十一)NamedWindow语法Merge、Queries、Indexing、Dropping

    On-Merge With Named Windows 功能:对window中的insert.update.delete操作进行组合运用. 格式: 1  "; 14      15  Sys ...