DLL的作用与用Delphi调用DLL的方法

rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">

一、 DLL的作用

1、  具有一定的安全性

    在开发的过程中,把一些具有独立功能的模块或常用函数用DLL封装起来可以加强应用程序的安全性,有效地防止应用程序的被反编译。

2、  可重用性、占用较少资源

标准的DLL有很好的可重用性。当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量;同时还可以被不同的开发语言调用,使得开发人员不再受开发语言的限制,可以有效地调配人力,以补开发力量的不足。

3、  推广模块式体系结构

   使用DLL有助于软件开发的模块化,功能独立的模块和一些常用函数都可以用DLL封装起来,让开发团队的人力得到很好的调配,最大限度地达到“各做各”的,避免了相关人员要等着别人把工作做完了自己才有事做的情况。

4、  便于修改和维护

   当程序出现问题地时候,开发人员可以快速地进行问题定位,很快地找出问题,不再要求在整个应用程序里查找,有如大海捞针。修改时也不必把整个应用程序重新编译、发布,只要更新相关的DLL。此外,如果这个更新的DLL同时被其它应用程序调用的话,那其它的应用程序也会得到更新。

二、 调用DLL的方法

1、  delphiDLL的两种调用方式

   delphi调用DLL有两种方式:静态调用和动态调用。调用DLL时宿主程序会为此DLL申请相对应的内存空间,静态调用是在宿主程序启动运行时就把DLL加载,直到宿主程序结束时才释放;动态调用是在需要调用时才把dll加载,用完时马上就释放内存空间,有效地利用资源。

   DLL函数用例:(dll的窗体与宿主程序的熔合)

   function createdllform(p:THandle):THandle;stdcall;

   begin

     frmdll:=Tfrmdll.Create(Application);

     frmdll.Show;

     frmdll.ParentWindow:=p;

     Result:=frmdll.Handle;

   end;

2、  动态调用方式

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls;

type

  TForm1 = class(TForm)

    btn1: TButton;

    pnl1: TPanel;

    procedure btn1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

  //定义DLL的相关回调函数

  Tcreatedllform = function (p:THandle): THandle; stdcall;

var

  Form1: TForm1;

Implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);

var

  l:THandle; //返回的DLL的句柄

  dllfrm:THandle;  //DLL函数返回值

  p:Tcreatedllform;

  i:Integer;

begin

  l:=LoadLibrary('Project1.dll');

  if l<>0 then

    @p:=GetProcAddress(l,PChar('createdllform'));

  if Assigned(p) then

    dllfrm:=p(pnl1.Handle);

  FreeLibrary(l);

end;

end.

3、  静态调用方式

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls;

type

  TForm1 = class(TForm)

    btn1: TButton;

    pnl1: TPanel;

    procedure btn1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

  //定义DLL的相关回调函数

  function  createdllform(p:THandle): THandle; stdcall;external 'Project1.dll';

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);

var

  dllfrm:THandle;  //DLL函数返回值

  i:Integer;

begin

  dllfrm:=createdllform(pnl1.Handle);

  //SetForegroundWindow(dllfrm);

  //Windows.SetFocus(dllfrm);

end;

end.

: 以上代码本人在 Delphi7 下调试通过 , 欢迎各位同事一起参与相关技术的讨论 , 表达意见
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Delphi中制作DLL •一 Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。 二参数传递 1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。 2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容。 3 用stdcall声明后缀。 4 最好大小写敏感。 5 无须用far调用后缀,那只是为了与windows 16位程序兼容。 三 DLL的初始化和退出清理[如果需要初始化和退出清理] 1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下: procedure DllEnterPoint(dwReason: DWORD);far;stdcall; dwReason参数有四种类型: DLL_PROCESS_ATTACH:进程进入时 DLL_PROCESS_DETACH进程退出时 DLL_THREAD_ATTACH 线程进入时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil); 3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。 四全局变量的使用 在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份, 但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据 传递,除非你用内存映像文件。 五、其他:调用方式按照标准的Windows调用方式. 六、关于参数传递 •Delphi程序之间调用DLL,如果要用String类型的话,要在引用的单元加上ShareMem 单元。 •如果Delphi写的DLL供其他开发工具使用的话,不要使用String类型,用PAnsiChar类型。 尽量使用标准DLL接口。指的是传递的参数类型及函数返回类型不能是Delphi特有的, 比如string(AnsiString),以及动态数组和含有这些类型成员的复合类型(如记录),也不 能是包含有这些类型成员数据成员的对象类型,以避免可能的错误。如果使用了string类型或 动态数组类型,且调用方不是Delphi程序,则基本上会报错。如果调用方是Delphi调用方或 被调用方没有在工程文件的第一包含单元不是ShareMem,也可能会出错。 七、关于回调Funciton 你可以把Callback函数看作是一种特殊的消息响应函数,一般来说我们不会自己调用这种函数, 而是有某些系统函数调用,而且不需要向后传递消息。 只要象C/C++这样支持函数指针的语言都 有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传 入的函数地址来调用你的函数 。 以上是结构化回调,到高级语言Object Pascal、C++中回调函数并没有退出,反而得到延伸与 扩展,在面向对像中的回调,其实是指面向对像中类对像的事件,事件就是原始的回调函数。面 向对像, 将回调函数定义成事件过程,在程序引用对像时,若指定了对像的过程事件后,那么在 要进行事件触发的地方检查事件过程是否分配,如果分中的就执行事,也就是执行了回调函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值