Акжан в сети - На уровень вверх(W32) Как правильно в Win32 отслеживать запуск второй копии программы?

FindWindow является неполным решением (если меняется заголовок окна или если есть другая программа с таким же заголовком или типом окна).

Вторично: Это работает медленно.

Правильно - использовать обьекты синхронизации Win32 API.

Лениво пользовать семафоры, покажу на именованных мутексах (семафоры с двумя состояниями).

Unit OneInstance32;

interface

implementation

uses
  Forms;

var
  g_hAppMutex: THandle;

function OneInstance: boolean;
var
  g_hAppCritSecMutex: THandle;
  dw: Longint;
begin
  g_hAppCritSecMutex := CreateMutex( nil, true, PChar(Application.Title + '.OneInstance32.CriticalSection') );

  // if GetLastError - лениво писать

  g_hAppMutex := CreateMutex( nil, false, PChar(Application.Title + 'OneInstance32.Default') );

  dw := WaitForSingleObject( g_hAppMutex, 0 );

  Result := (dw <> WAIT_TIMEOUT);

  ReleaseMutex( g_hAppCritSecMutex ); // необязательно вследствие последующего закрытия
  CloseHandle( g_hAppCritSecMutex );

end;

initialization

  g_hAppMutex := 0;

finalization

  if LongBool( g_hAppMutex ) then
  begin
    ReleaseMutex( g_hAppMutex); // необязательно
    CloseHandle( g_hAppMutex );
  end;

end.

Akzhan Abdulin

akzhan@mental.khv.ru