Is there a way under Delphi 3 and 4 to determine if a previous instance of the application is already running?

Yes, there is a way to determine if a previous instance of the application is already running. Try the following:

// ===================================================// Called by your project file, prevents a 2nd// instance of the program from executing and// instead activates the already executing instance.// Returns TRUE if a previous instance of the// program is already running.// ===================================================function IsPrevInst: Boolean;var  semName,  appClass: PChar;  hSem    : THandle;  hWndMe  : HWnd;  appTitle: Array[0..MAX_PATH] of Char;begin  // Init  Result := FALSE;  GetMem(semName,15);  GetMem(appClass,15);  StrPCopy(semName,'SemaphoreName');  StrPCopy(appClass,'TApplication');  StrPCopy(appTitle,ExtractFileName(Application.Title));  // Create a Semaphore in memory.  If this is the  // first instance, then hSem's value should be 0.  hSem := CreateSemaphore(nil,0,1,semName);  // Check to see if the semaphore exists  if (hSem  0) and (GetLastError() = ERROR_ALREADY_EXISTS) then    begin      CloseHandle(hSem);      // Get the currently executing window's handle then change      // its title so we can look for the other instance      hWndMe := FindWindow(appClass,appTitle);      SetWindowText(hWndMe,'ZZZZZZZ');      // Search for the other instance of this window then bring      // it to the top of the Z-order stack.  We find it by      // matching the Application Class and Application Title.      hWndMe := FindWindow(appClass,appTitle);      if (hWndMe  0) then        begin          BringWindowToTop(hWndMe);          ShowWindow(hWndMe,SW_SHOWNORMAL);        end;      Result := TRUE;    end;  // Destroy PChars  FreeMem(semName,15);  FreeMem(appClass,15);end;

Load this code into your project file, and try it out. It’ll detect a previous instance, close the current one, then pop up the previous instance to the top of the Z-order.


Share the Post: