unit uMain; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, StrUtils; Type TDllFunc = function : Boolean; stdcall; { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end; var Form1: TForm1; implementation {$R *.lfm} uses uSimpleClassReg; { TForm1 } function DllInit: Boolean; stdcall; external 'project1Dll.dll'; function DllIsRegistered: Boolean; stdcall; external 'project1Dll.dll'; function DllRegister: Boolean; stdcall; external 'project1Dll.dll'; function DllUnRegister: Boolean; stdcall; external 'project1Dll.dll'; procedure TForm1.Button1Click(Sender: TObject); Var DllIsRegistered : TDllFunc; DllRegister : TDllFunc; DllUnRegister : TDllFunc; DllInit : TDllFunc; LIbHandle : TLibHandle; begin LIbHandle := SafeLoadLibrary( 'project1Dll.dll' ); if LIbHandle<>0 then begin DllIsRegistered := TDllFunc( GetProcAddress( LIbHandle, 'DllIsRegistered')); DllRegister := TDllFunc(GetProcAddress( LIbHandle, 'DllRegister')); DllUnRegister := TDllFunc(GetProcAddress( LIbHandle, 'DllUnRegister')); DllInit := TDllFunc(GetProcAddress( LIbHandle, 'DllInit')); if Assigned(DllInit) and Assigned(DllIsRegistered) and Assigned(DllRegister) and Assigned(DllUnRegister) then begin Memo1.Lines.Clear; Memo1.Lines.Add('Dll Init = '+ ifthen(Boolean(DllInit), 'True','False')); Memo1.Lines.Add('Is registered in EXE = '+ ifthen(IsClassRegistered(HInstance), 'True','False')); Memo1.Lines.Add('Regiser in EXE result = '+ ifthen(RegisterClass(HInstance), 'True','False')); Memo1.Lines.Add('Is registered in EXE = '+ ifthen(IsClassRegistered(HInstance), 'True','False')); Memo1.Lines.Add('Is registered in DLL = '+ ifthen(Boolean(DllIsRegistered), 'True','False')); Memo1.Lines.Add('Regiser in DLL result = '+ ifthen(Boolean(DllRegister), 'True','False')); Memo1.Lines.Add('Is registered in DLL = '+ ifthen(Boolean(DllIsRegistered), 'True','False')); Memo1.Lines.Add('UnRegiser in DLL result = '+ ifthen(Boolean(DllUnRegister), 'True','False')); Memo1.Lines.Add('Is registered in DLL = '+ ifthen(Boolean(DllIsRegistered), 'True','False')); Memo1.Lines.Add('Is registered in EXE = '+ ifthen(IsClassRegistered(HInstance), 'True','False')); Memo1.Lines.Add('UnRegiser in EXE result = '+ ifthen(UnRegisterClass(HInstance), 'True','False')); Memo1.Lines.Add('Is registered in EXE = '+ ifthen(IsClassRegistered(HInstance), 'True','False')); end else ShowMessage('Get Proc Address failed!'); end else begin ShowMessage('Unable to load library!'); end; end; procedure TForm1.Button2Click(Sender: TObject); var S: string; begin Memo1.Clear; WriteStr(S, 'Dll Init result = ', DllInit); Memo1.Append(S); WriteStr(S, 'Is registered in EXE = ', IsClassRegistered(HInstance)); Memo1.Append(S); WriteStr(S, 'Regiser in EXE result = ', RegisterClass(HInstance)); Memo1.Append(S); WriteStr(S, 'Is registered in EXE = ', IsClassRegistered(HInstance)); Memo1.Append(S); WriteStr(S, 'Is registered in DLL = ', DllIsRegistered); Memo1.Append(S); WriteStr(S, 'Regiser in DLL result = ', DllRegister); Memo1.Append(S); WriteStr(S, 'Is registered in DLL = ', DllIsRegistered); Memo1.Append(S); WriteStr(S, 'UnRegiser in DLL result = ', DllUnRegister); Memo1.Append(S); WriteStr(S, 'Is registered in DLL = ', DllIsRegistered); Memo1.Append(S); WriteStr(S, 'Is registered in EXE = ', IsClassRegistered(HInstance)); Memo1.Append(S); WriteStr(S, 'UnRegiser in EXE result = ', UnRegisterClass(HInstance)); Memo1.Append(S); WriteStr(S, 'Is registered in EXE = ', IsClassRegistered(HInstance)); Memo1.Append(S); end; end.