Delphi中一些DLL的运用。

 
临时转载一些别人的代码:
 
代码
dll 调用部分:

{****************************************************************}
{ }
{ Project: DllDebug                                  }
{ Copyright(c) 2003, 2005                 }
{ Unit for UCommonUnit                          }
{ Create  : 2003-01-05 by 林红卫             }
{ Modify  : 2003-01-16 by 林红卫             }
{                                                                }
{****************************************************************}

unit UCommonUnit;

interface

uses
  Windows,
  SysUtils,
  Forms;

type
  TRunDLL 
= procedure(DLLName, FormName, FormCaption: PChar;
    aApp: TApplication; Scr: TScreen) 
stdcall;

procedure RunDLLForm(DLLName, FormName, FormCaption: string;
  aApp: TApplication; Scr: TScreen) 
stdcall;

implementation

procedure RunDLLForm(DLLName, FormName, FormCaption: string;
  aApp: TApplication; Scr: TScreen) 
stdcall;
var
  RunDLL: TRunDLL;
  GetDllHWND: HWND;
begin
  GetDllHWND :
= LoadLibrary(PChar(DllName));
  
try
    
if GetDllHWND < 32 then
    
begin
      MessageBox(
0'没有找到附带DLL文件,请确认程序是否完整!',
        
'加载DLL失败', MB_OK);
      Exit;
    
end;

    @RunDLL :
= GetProcAddress(GetDllHWND, 'RunDLL');
    
if @RunDLL <> nil then
    
try
      RunDLL(PChar(UpperCase(Trim(DLLName))), PChar(UpperCase(Trim(FormName))),
        PChar(FormCaption), aApp,Scr);
    
except
      
raise Exception.Create('T' + FormName + '不存在!');
    
end;
  
finally
    FreeLibrary(GetDllHWND);
  
end;
end;

end.

dll :

{****************************************************************}
{ }
{ Project: UDllTest                      }
{ Copyright(c) 2003, 2005                 }
{ Unit for UDllTest                             }
{ Create  : 2003-01-05 by 林红卫             }
{ Modify  : 2003-01-16 by 林红卫             }
{                                                                }
{****************************************************************}

library UDllTest;

uses
  SysUtils,
  Forms,
  Messages,
  Variants,
  Windows,
  Classes,
  UFrmTestForm1 
in 'UFrmTestForm1.pas' {Form1},
  UFrmTestForm2 
in 'UFrmTestForm2.pas' {Form2};

var
  DLLApp: TApplication;
  DLLScreen: TScreen;

procedure RunDLL(DLLName, FormName, FormCaption: PChar;
  aApp: TApplication; Scr: TScreen) 
stdcall;
var
  TheClass: TPersistentClass;
  aForm: TForm;
begin
  Application :
= aApp;
  Screen :
= Scr;
  RegisterClasses([TForm1, TForm2]);

  TheClass :
= GetClass('T' + FormName);
  
if (TheClass = nilthen
    GetLastError;

  
if TheClass.InheritsFrom(TForm)
    
and (TheClass <> TForm) then
  
begin
    aForm :
= TForm(TheClass.Create).Create(nil);
    aForm.Caption :
= FormCaption;
    
try
      aForm.ShowModal;
    
finally
      FreeAndNil(aForm);
    
end;
  
end;
end;

procedure DLLUnloadProc(dwReason: DWORD);
begin
  
if dwReason = DLL_PROCESS_DETACH then
  
begin
    Application :
= DLLApp; //恢复
    Screen :
= DLLScreen;
  
end;
end;

exports
  RunDLL;

begin
  DLLApp :
= Application; //保存 DLL 中初始的 Application 对象
  DLLScreen :
= Screen;
  DLLProc :
= @DLLUnloadProc; //保证 DLL 卸载时恢复原来的 Application
  DLLUnloadProc(DLL_PROCESS_DETACH);
end.

 

posted @ 2010-07-16 14:56  努力偷懒  阅读(674)  评论(0编辑  收藏  举报