Dll 中写法:
Var
SaveExit : Pointer;
DLLApplication : TApplication;
DLLScreen : TScreen;
{$R *.res}
Procedure LibExit;
Begin
ExitProc := SaveExit;
End;
Procedure DLLMain(Reason: Integer);
Begin
Case Reason Of
DLL_PROCESS_ATTACH: Begin
DLLApplication := Application;
DLLScreen := Screen;
End;
DLL_PROCESS_DETACH: Begin
Application := DLLApplication;
Screen := DLLScreen;
ZeroMemory(@LocalInfo, SizeOf(LocalInfo));
End;
End;
End;
Begin
DLLProc := @DLLMain;
DLLMain(DLL_PROCESS_ATTACH);
SaveExit := ExitProc;
ExitProc := @LibExit;
End.
//以上写在library 中
//下面的写在Unit中
type
TLocalInfo = Record
ClientIp: String;
ClientPCName: String;
ClientName: String;
ClientVersion: String;
User: String;
UserName: String;
UserDept: String;
UserEmail: String;
NetConnected: Boolean;
SfcConnected: Boolean;
ErpConnected: Boolean;
End;
Procedure Start(pApplication: TApplication; pScreen: TScreen; pLocal: TLocalInfo;obj:TPanel); stdcall; export;
Procedure Start(pApplication: TApplication; pScreen: TScreen; pLocal: TLocalInfo;obj:TPanel);
Begin
Screen := pScreen;
Application := pApplication;
LocalInfo := pLocal;
Application.CreateForm(TForm1, Form1);
Form1.Parent := obj;
End;
调用主程序中写法:
var
OpenMDIForm : procedure(pApplication: TApplication; pScreen: TScreen; pLocal: TLocalInfo)stdcall;
dlgOpen1.Execute;
NamePath := dlgOpen1.FileName;
if FileExists(NamePath) then
begin
DLLHandle := LoadLibrary(PChar(NamePath));
@OpenMDIForm := GetProcAddress(DLLHandle, 'Start');
If Assigned(@OpenMDIForm) Then Begin
OpenMDIForm(Application, Screen, Local);
end;
end;
注意:需要设置DLL窗体及调用窗体未MDIForm