Собственно идея такая - при старте пытаемся создать поименованный mutex. Имя уникальное, в данном случае - 'WAD Explorer already loaded!'. Если он создался - то значит проги в памяти ещё нет. Если выдал ошибку - программа в памяти уже болтается.
Кусок кода DPR-файла. C комментариями
[pre]
Var MutexHandle:THandle;
Function IsNextInstance:Boolean; //Проверяет, а не существуем ли мы...
Begin
*Result:=FALSE;
*MutexHandle:=CreateMutex( nil,False,'WAD Explorer already loaded!');
*If MutexHandle<>0
*Then If GetLastError=ERROR_ALREADY_EXISTS Then Result:=TRUE;
End;
begin
* *If IsNextInstance
* *then
* *Begin
* * * *//предыдущий экземпляр программы уже в памяти
* * * *//можно передать ей какое-нибудь сообщение
* * * *//......
* * * *//и закрыться
* * * *Closehandle(MutexHandle); //закрываем Handle
* * * *halt;
* * end;
* *//предыдущей версии программы в памяти нет - дальше
* *//стандартный код DPR-модуля
* *Application.Initialize;
* *Application.Title := 'WAD explorer';
* *Application.CreateForm(TMainWadExplorerForm, MainWadExplorerForm);
* *Application.Run;
* //что у винды взяли - надо отдать - закрываем handle
* *//т.к это будет последний экземпляр handle, то и Mutex тоже закроется
* *Closehandle(MutexHandle);
end.
[/pre]