看到有網友需要這樣的例子,是以寫了一個.
有不對或不合理的地方請跟帖指導.
delph XE下測試通過.
Dll項目檔案
library Project10;
uses
SysUtils,
Classes,
Forms,
Unit14 in 'Unit14.pas' {Form1};
{$R *.res}
Function EDebtMoney(H: THandle): integer;
begin
Application.Handle := H;
with TForm1.Create(Application) do
try
ShowModal;
Result := 0;
finally
Free; { 調用結束時銷毀視窗 }
end;
end;
Function GetForm(H: THandle): THandle;
begin
Application.Handle := H;
with TForm1.Create(Application) do
try
Show;
Result := Handle;
except on e : Exception do
raise e.Create(e.Message);
end;
end;
exports EDebtMoney, GetForm;
begin
end.
dll中窗體關閉事件
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
調用單元
unit Unit13;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm13 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form13: TForm13;
function MyForm(H: THandle) : THandle; stdcall;
implementation
function MyForm; external 'Project10.dll' name 'GetForm';
{$R *.dfm}
//動态調用 模态視窗
procedure TForm13.btn1Click(Sender: TObject);
type
TGetForm = function (H: THandle) : Integer; cdecl;
var
DllForm : TGetForm;
DllHandle : THandle;
nn : integer;
begin
DllHandle := LoadLibrary(PChar('Project10.dll'));
try
if DllHandle <> 0 then
begin
DllForm := GetProcAddress(DllHandle, 'EDebtMoney');
nn := DllForm(Application.Handle) ;
self.Caption := inttostr(nn);
end;
finally
FreeLibrary(DllHandle);
end;
end;
//靜态調用 非模态視窗
procedure TForm13.btn2Click(Sender: TObject);
var
DllHandle : THandle;
begin
DllHandle := MyForm(Application.Handle);
end;
end.