delphi DLL初始化和退出处理


本文整理自网络,侵删。

 
1. 概述
一般的DLL不需要做初始化和善后工作,但如果想让DLL在被载入时先作一些初始设定,或者退出时释放资源,则可以用以下方法达到目的。

#2. 利用Unit的Initalization与Finalization这两个小节
可以在Unit的这两个小节中安排Unit的进入和退出,但是Program 与 Library并没有这两个部分,所以只能写在Unit中。

#3. 利用ExitProc变量释放资源
在Library的begin ..end.中间是可以写代码 的, 这里可以放置DLL初始化代码 。如果想要做善后工作,则可以利用ExitProc变量。我们首先在初始化代码 中 把ExitProc中包含的默认的善后过程地址保存下来,然后把自定义的过程的地址赋给它,这样DLL退出时就会执行我们制定的程序;在 自定义的过程的最后,把ExitProc恢复原来的默认值,以便DLL能够继续完成原来默认的善后工作。下面是示例:

  library MyDLL;
  ...
  OldExitProc: pointer;
  ...
  procedure MyExitProc;
  begin
  ... //善后程序
  ExitProc := OldExitProc;
  end;
  ...
  begin
  ... //初始化程序
   OldExitProc := ExitProc;
  ExitProc := @MyExitProc;
  end.

#4. 利用DllProc变量
和ExitProc一样,DllProc也是一个在Systemd单元中预定义的变量。 在使用DLLProc时, 必须先写好一个具有以下原型的程序:


procedure DLLHandler(Reason: integer);


并在library的begin ..end.之间, 将这个DLLHandler程序的执行地址赋给DLLProc中, 这时就可以根据参数Reason的值分别作出相应的处理。另外注意要 将Windows单元加入uses子句。示例如下:

  library TestDLL;
  ...
procedure MyDLLHandler(Reason: integer);
begin
case Reason of
    DLL_PROCESS_DETACH:
      begin
        ShowMessage('整个DLL的善後程序');
      end;
    DLL_Process_Attach:
      begin
        ShowMessage('整个DLL的初始化代码 ');
      end;

    DLL_Thread_Attach:
      begin
        ShowMessage('当主叫端开始一个Thread时');
      end;
    DLL_Thread_Detach:
      begin
        ShowMessage('当主叫端终止一个Thread时');
      end;
end;

end;


//初始化代码
DLLProc := @MyDLLHandler;
MyDLLHandle(DLL_Process_Attach);
end.


当DLL支援多进程(Thread)的处理时, DllProc非常适合使用。

来源:http://www.coder163.com/language/delphi/console/DLL%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%80%80%E5%87%BA%E5%A4%84%E7%90%86.html

相关阅读 >>

Delphi 调用js解决全角转半角

Delphi android实例-读取设备联系人(xe8+小米2)

Delphi 解决idtcpclient和idtcpserver通信中文乱码问题

Delphi trestclient + trestrequest + trestresponse

Delphi webbrowser1 querystatuswb

Delphi xe7 rest获取天气实例

Delphi按下esc键就退出程序

Delphi filesearch 获取指定文件夹下所有文件包括隐藏文件

Delphi 为 service application 添加描述文本的方法

Delphi webbrowser1使用进度条查看浏览器状态

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...