Question:
Is there a way under Delphi 3 and 4 to determine if a previous instance of the application is already running?
Answer:
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.