unit GlobalForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, GlobalHdr;
type
TReadInfoProc = procedure(var GlobalInfo: TGlobalInfo; var LocalThreads: integer); stdcall;
TSetProc = procedure(NewValue: integer); stdcall;
TIncDecProc = procedure; stdcall;
TProcs = record
ReadProc: TReadInfoProc;
SetProc: TSetProc;
IncProc, DecProc: TIncDecProc;
end;
TGlobalFrm = class(TForm)
GlobalProcessEdit: TEdit;
GlobalThreadEdit: TEdit;
LocalThreadEdit: TEdit;
SharedDataEdit: TEdit;
ReadBtn: TButton;
IncBtn: TButton;
DecBtn: TButton;
SetBtn: TButton;
CreateThread: TButton;
LoadDLLBtn: TButton;
procedure ReadBtnClick(Sender: TObject);
procedure IncBtnClick(Sender: TObject);
procedure DecBtnClick(Sender: TObject);
procedure SetBtnClick(Sender: TObject);
procedure CreateThreadClick(Sender: TObject);
procedure LoadDLLBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
Procs: TProcs;
Loaded: boolean;
LibHandle: THandle;
public
{ Public declarations }
end;
var
GlobalFrm: TGlobalFrm;
implementation
uses DelayThread;
{$R *.DFM}
procedure TGlobalFrm.ReadBtnClick(Sender: TObject);
var
GlobalInfo: TGlobalInfo;
LocalThreads: integer;
begin
if Loaded then
begin
Procs.ReadProc(GlobalInfo, LocalThreads);
GlobalProcessEdit.Text := IntToStr(GlobalInfo.GlobalProcesses);
GlobalThreadEdit.Text := IntToStr(GlobalInfo.GlobalThreads);
SharedDataEdit.Text := IntToStr(GlobalInfo.SharedNumber);
LocalThreadEdit.Text := IntToStr(LocalThreads);
end;
end;
procedure TGlobalFrm.IncBtnClick(Sender: TObject);
begin
if Loaded then
begin
Procs.IncProc;
ReadBtnClick(Sender);
end;
end;
procedure TGlobalFrm.DecBtnClick(Sender: TObject);
begin
if Loaded then
begin
Procs.DecProc;
ReadBtnClick(Sender);
end;
end;
procedure TGlobalFrm.SetBtnClick(Sender: TObject);
var
NewInt: integer;
begin
if Loaded then
begin
NewInt := StrToInt(SharedDataEdit.Text);
Procs.SetProc(NewInt);
end;
end;
procedure TGlobalFrm.CreateThreadClick(Sender: TObject);
var
NewThread: TDelayThread;
begin
NewThread := TDelayThread.Create(true);
NewThread.FreeOnTerminate := true;
NewThread.Resume;
end;
procedure TGlobalFrm.LoadDLLBtnClick(Sender: TObject);
begin
if not Loaded then
begin
LibHandle := LoadLibrary('GlobalData.dll');
if LibHandle = INVALID_HANDLE_VALUE then exit;
with Procs do
begin
ReadProc := GetProcAddress(LibHandle, 'ReadInfo');
IncProc := GetProcAddress(LibHandle, 'IncSharedInteger');
DecProc := GetProcAddress(LibHandle, 'DecSharedInteger');
SetProc := GetProcAddress(LibHandle, 'SetSharedInteger');
if not (Assigned(ReadProc) and Assigned(IncProc) and Assigned(DecProc)
and Assigned(SetProc)) then
begin
FreeLibrary(LibHandle);
LibHandle := INVALID_HANDLE_VALUE;
exit;
end;
Loaded := true;
end;
end;
end;
procedure TGlobalFrm.FormCreate(Sender: TObject);
begin
LibHandle := INVALID_HANDLE_VALUE;
end;
procedure TGlobalFrm.FormDestroy(Sender: TObject);
begin
if LibHandle <> INVALID_HANDLE_VALUE then
FreeLibrary(LibHandle);
end;
end.