转贴
一般的DLL不需要做初始化和善后工作,因此大部分读者可以跳
过这一节。但如果你想让你的DLL在被载入时先作一些初始设定,或
者退出时释放资源,则可以有三种方法达到目的:<1>利用Unit的Initalization与Finalization这两个小节
  可以在Unit的这两个小节中安排Unit的进入和退出,但是
Program与Library并没有这两个部分,所以只能写在Unit中。<2>利用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.<3>利用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_Attach: //整个DLL的初始化代码
    DLL_Process_Detach: //整个DLL的善後程序
    DLL_Thread_Attach: //当主叫端开始一个Thread时
    DLL_Thread_Detach: //当主叫端终止一个Thread时
   end;
  end;
  ...
  begin
  ... //初始化代码
  DLLProc := @MyDLLHandler;
  MyDLLHandle(DLL_Process_Attach);
  end.
由上例可以知道,当DLL支援多进程(Thread)的处理时, DllProc非常
适合使用。

解决方案 »

  1.   

    可是我的DLL中没有公共变量,只是在函数中定义了局部变量,不存在需要初始化DLL
      

  2.   

    unit U_EncryptDll;interfaceuses SysUtils;procedure Encode(csPasswd: string; var EncryptText: string;keyParam: integer= 3);stdcall;implementationprocedure Encode(csPasswd: string; var EncryptText: string; keyParam: integer= 3);stdcall;
    var
      orgrdno,len: integer;
      p: PAnsiChar;
      inistr: string;
      hour,min,sec,msec: word;
    begin
      inistr := 'abcdefghijklmnopqrstuvwxyz'+#0;
      decodetime(now,hour,min,sec,msec);
      orgrdno := msec mod 37;
      if orgrdno = 0 then
        orgrdno :=1;
      p := @inistr[1];
      p^ :=  chr((not orgrdno)+76+keyParam);
      (p+1)^ := chr(length(ansistring(cspasswd))+keyparam+orgrdno);
      len := length(cspasswd);
      inistr := copy(inistr,1,2)+cspasswd+copy(inistr,len+3,length(inistr)-(len+2));
      p := @inistr[3];
      while p^ <> #0 do
      begin
        p^ := chr(((not byte(p^))+orgrdno) xor orgrdno);
        if ((p-@inistr[1])mod 2)=1 then
          p^ := chr(byte(p^)+keyparam+(p-@inistr[1]))
        else
          p^ := chr(byte(p^)-keyparam-(p-@inistr[1]));
        p := p+1;   
      end;
      EncryptText := inistr;
    end;end.