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 件のコメント:
コメントを投稿