program Project2;
uses
Windows,
SysUtils,
Messages,
Forms,
Unit2 in 'Unit2.pas' {Form2};
{$R *.RES}
const
{ Atom name }
CAtomName: String = '{7B0C8E12-F168-4DA4-89C9-E4C86BE404FE}';
var
AppAtom: ATOM;
Wnd: HWnd;
AppWnd: HWnd;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
if GlobalFindAtom(PChar(CAtomName)) <> 0 then
begin
{ Search main form }
Wnd := FindWindow(PChar('TForm2'),nil); // Class name of the main form
if Wnd = 0 then
begin
Exit;
end;
{ Bring foreground and activate }
SetForegroundWindow(Wnd);
{ Get window handle of TApplication }
AppWnd := GetWindowLong(Wnd,GWL_HWNDPARENT);
if AppWnd <> 0 then
begin
Wnd := AppWnd;
end;
{ Restore if iconized }
if IsIconic(Wnd) then
begin
SendMessage(Wnd,WM_SYSCOMMAND,SC_RESTORE,-1);
end;
Exit;
end;
AppAtom := GlobalAddAtom(PChar(CAtomName));
try
Application.CreateForm(TForm2, Form2);
Application.Run;
finally
GlobalDeleteAtom(AppAtom);
end;
end.
として一つ目のインスタンスを実行し、強制的に終了してから二つ目のインスタンスを実行してみましたが、GlobalFindAtom(ja)で有効なglobal atomが取得できてしまい、ログオフ/再起動を行うまでプログラムは有効に起動できません。ということでアプリケーションの多重実行を禁止するのにglobal atomを使用するのは不適切である(global atomの用途として適切ではない)、という結論に達しました。元ねたはTrial Delphi Programs: Allow Only One Application Execution Per Windows Session。
0 件のコメント:
コメントを投稿