Files
HeidiSQL/extra/IpcExample/IpcMain.pas

199 lines
4.6 KiB
ObjectPascal

unit IpcMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, MysqlQueryThread, MysqlQuery, IpcSession;
type
TForm1 = class(TForm)
Panel2: TPanel;
StatusBar1: TStatusBar;
pnMain: TPanel;
pnWindowList: TPanel;
Panel3: TPanel;
Panel5: TPanel;
Panel6: TPanel;
Panel7: TPanel;
lvWindows: TListView;
Label2: TLabel;
Button2: TButton;
Splitter1: TSplitter;
Panel4: TPanel;
Memo1: TMemo;
Button3: TButton;
Label3: TLabel;
Button4: TButton;
Button5: TButton;
pnSessionSettings: TPanel;
Label1: TLabel;
edConnName: TEdit;
Button1: TButton;
Label5: TLabel;
CheckBox1: TCheckBox;
procedure CheckBox1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lvWindowsDblClick(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure SessOpened(Sender: TObject);
procedure SessClosed(Sender: TObject);
private
FSess : TIpcSession;
function AssembleConnParams: TOpenConnProf;
public
procedure HandleWMCopyData(var msg: TWMCopyData); message WM_COPYDATA;
procedure DumpWindowList();
procedure DebugWrite(AMsg : String);
end;
var
Form1: TForm1;
implementation
uses communication, synchronization, threading, helpers;
{$R *.dfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
FSess.Name := edConnName.Text;
DumpWindowList();
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DumpWindowList();
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
CheckForCrashedWindows();
DumpWindowList();
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if FSess.Open(True,edConnName.Text) then
begin
end;
DumpWindowList();
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
FSess.Close();
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
FSess.ConnectedFlag := CheckBox1.Checked;
end;
procedure TForm1.DebugWrite(AMsg: String);
begin
Memo1.Lines.Add(AMsg);
end;
procedure TForm1.DumpWindowList;
var
wda : TWindowDataArray;
i : Integer;
li : TListItem;
begin
lvWindows.Items.BeginUpdate();
lvWindows.Items.Clear();
wda := GetWindowList();
for i := Low(wda) to High(wda) do
begin
li := lvWindows.Items.Add();
li.Caption := Format('%d',[i]);
li.SubItems.Add(Format('%d',[wda[i].AppHandle]));
li.SubItems.Add(wda[i].Name);
li.SubItems.Add(Format('%d',[Ord(wda[i].Connected)]));
//DebugWrite(Format('%d -- Handle: %d Name: %s',[i,wda[i].AppHandle,wda[i].Name]));
end;
lvWindows.Items.EndUpdate();
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FSess := TIpcSession.Create(Self,Handle);
FSess.OnOpened := SessOpened;
FSess.OnClosed := SessClosed;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil (FSess);
end;
procedure TForm1.HandleWMCopyData(var msg: TWMCopyData);
var
method: DWORD;
begin
// extract info from message
method := msg.CopyDataStruct^.dwData;
// display
DebugWrite(Format('WM_COPYDATA received; method=%d',[method]));
if method in [CMD_EXECUTEQUERY_NORESULTS,CMD_EXECUTEQUERY_RESULTS] then
DebugWrite(Format('Request: %d -- Query: %s',[GetRequestIdFromMsg(msg),GetQueryFromMsg(msg)]));
// release
ReleaseRemoteCaller(ERR_UNSPECIFIED);
end;
procedure TForm1.lvWindowsDblClick(Sender: TObject);
var
h : THandle;
begin
if lvWindows.Selected<>nil then
begin
h := StrToIntDef(lvWindows.Selected.SubItems[0],0);
if h<>0 then
ActivateWindow(h);
end;
end;
procedure TForm1.SessClosed(Sender: TObject);
begin
DebugWrite('Ipc session closed');
pnWindowList.Enabled := False;
end;
procedure TForm1.SessOpened(Sender: TObject);
begin
DebugWrite('Ipc session opened');
pnWindowList.Enabled := True;
end;
function TForm1.AssembleConnParams: TOpenConnProf;
begin
ZeroMemory(@Result,SizeOf(Result));
Result.MysqlParams.Host := 'localhost';
Result.MysqlParams.Database := 'test';
Result.MysqlParams.Protocol := 'mysql';
Result.MysqlParams.User := 'root';
Result.MysqlParams.Pass := '';
Result.MysqlParams.Port := StrToIntDef('',3306);
end;
end.