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.