library DLLEntryLib; uses SysUtils, Windows, Dialogs, Classes;
procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: ShowMessage('Attaching to process'); DLL_PROCESS_DETACH: ShowMessage('Detaching from process'); DLL_THREAD_ATTACH: MessageBeep(0); DLL_THREAD_DETACH: MessageBeep(0); end; end;
begin { First, assign the procedure to the DLLProc variable } DllProc := @DLLEntryPoint; { Now invoke the procedure to reflect that the DLL is attaching to the process } DLLEntryPoint(DLL_PROCESS_ATTACH); end. { Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira }
unit MainFrm;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Gauges;
type
{ Define a TThread descendant } TTestThread = class(TThread) procedure Execute; override; procedure SetCaptionData; end;
TMainForm = class(TForm) btnLoadLib: TButton; btnFreeLib: TButton; btnCreateThread: TButton; btnFreeThread: TButton; lblCount: TLabel; procedure btnLoadLibClick(Sender: TObject); procedure btnFreeLibClick(Sender: TObject); procedure btnCreateThreadClick(Sender: TObject); procedure btnFreeThreadClick(Sender: TObject); procedure FormCreate(Sender: TObject); private LibHandle: THandle; TestThread: TTestThread; Counter: Integer; GoThread: Boolean; end;
var MainForm: TMainForm;
implementation
{$R *.DFM}
procedure TTestThread.Execute; begin while MainForm.GoThread do begin Synchronize(SetCaptionData); Inc(MainForm.Counter); end; end;
procedure TTestThread.SetCaptionData; begin MainForm.lblCount.Caption := IntToStr(MainForm.Counter); end;
procedure TMainForm.btnLoadLibClick(Sender: TObject); { This procedure loads the library DllEntryLib.DLL } begin if LibHandle = 0 then begin LibHandle := LoadLibrary('DLLENTRYLIB.DLL'); if LibHandle = 0 then raise Exception.Create('Unable to Load DLL'); end else MessageDlg('Library already loaded', mtWarning, [mbok], 0); end;
procedure TMainForm.btnFreeLibClick(Sender: TObject); { This procedure frees the library } begin if not (LibHandle = 0) then begin FreeLibrary(LibHandle); LibHandle := 0; end; end;
procedure TMainForm.btnCreateThreadClick(Sender: TObject); { This procedure creates the TThread instance. If the DLL is loaded a message beep will occur. } begin if TestThread = nil then begin GoThread := True; TestThread := TTestThread.Create(False); end; end;
procedure TMainForm.btnFreeThreadClick(Sender: TObject); { In freeing the TThread a message beep will occur if the DLL is loaded. } begin if not (TestThread = nil) then begin GoThread := False; TestThread.Free; TestThread := nil; Counter := 0; end;
end;
procedure TMainForm.FormCreate(Sender: TObject); begin LibHandle := 0; TestThread := nil; end;
end.
|