[fpc-pascal] File Association and opening with already running app

Dennis dec12 at avidsoft.com.hk
Thu Apr 4 17:34:48 CEST 2013


In windows, you can create Mutex. That's how I ensure no other instance 
of the same program is running.

YourIDString is a string that you use to uniquely id your program instance .


   if OpenMutex(MUTEX_ALL_ACCESS, False, PChar(YourIDString)) = 0 then begin
     // First one - the mutex didn't exist, so create it.
     Result := CreateMutex(nil, False, PChar(YourIDString));
     MutexList.Add(pointer(Result));
   end else begin
     raise Exception.Create('The same program has been running already');
   end;


Make sure your free all mutex in the finalization of your unit or program

procedure FreeAllMutexes;
var
   M       : THandle;
   i       : integer;
begin
   for i := 0 to MutexList.Count - 1 do begin
     M := THandle(MutexList[i]);
     if M <> 0 then begin
       if not CloseHandle(M) then
         raise Exception.Create('Failed to release mutex:' + IntToStr(M));
       MutexList[i] := nil;
     end;
   end;
end;



Mark Morgan Lloyd wrote:
> Graeme Geldenhuys wrote:
>> On 2013-04-04 10:45, Mark Morgan Lloyd wrote:
>>> So far I've had no success porting that to Windows using named pipes,
>>
>> Ah, thanks for the idea. SimpleIPC should be able to do the trick -
>> similar to how apps communicate to a DebugServer (using dbugintf and
>> SimpleIPC units).
>>
>> First instance will search for a known IPC server, if none exist, start
>> the Simple IPC server. Second instance will first see if a existing IPC
>> server exists, and if so, send the open command to it, then quit.
>
> Yes, I agree. But my preference is to put the socket/pipe in the 
> user's home directory (i.e. rather than /tmp which is where it's 
> usually put), to name it including the PID to make it easily 
> trackable, and to use some combination of the original project name, 
> the final executable name (and possibly something from a .ini file) so 
> that it's possible to handle multiple instances.
>
> I suggest also adding status commands etc., i.e. so that you can query 
> whether a server's running, what its build is and so on. The way I did 
> it wasn't very good for that: it really needs bidirectional 
> communications (e.g. so that you can get the running copy's version 
> rather than just a version number from the binary you've just 
> executed) which isn't something I designed in.
>



More information about the fpc-pascal mailing list