標籤:
dll 調用部分:{****************************************************************}{ }{ Project: DllDebug }{ Copyright(c) 2003, 2005 }{ Unit for UCommonUnit }{ Create : 2003-01-05 by 林紅衛 }{ Modify : 2003-01-16 by 林紅衛 }{ }{****************************************************************}unit UCommonUnit;interfaceuses 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;implementationprocedure 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 = nil) then 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.
http://www.cnblogs.com/kfarvid/archive/2010/07/16/1778930.html
Delphi中一些DLL的運用(要傳遞Application和Screen,似乎還忘了傳遞提示控制項)