Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как в Delphi узнать, есть процесс в памяти или нет? (http://forum.oszone.net/showthread.php?t=30297)

[mzd] 09-09-2003 15:41 208122

Нужно сделать одноэкземплярное (блин, слово-то какое:) ) приложение. Окон у него нет, только иконка в трее, такчто поиск окна ничего не дает :(. В памяти запущен процесс с именем экзешника этой проги. Так вот, как в Delphi сделать проверку на наличие процесса в памяти?

CyberDaemon 09-09-2003 16:08 208123

Как вариант: копай в сторону CreateMutex. Пример куска кода, где прога проверяет наличие себя любимой в памяти могу запостить завтра.

[mzd] 09-09-2003 16:41 208124

CyberDaemon
Заранее спасибо

CyberDaemon 10-09-2003 08:31 208125

Собственно идея такая - при старте пытаемся создать поименованный 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]


Guest 13-09-2003 13:34 208126

лучше - проще и эффективнее

TEvent
или API - CreateEvent(..."Unique name")
и проверить код ошибки - см. SDK

[mzd] 15-09-2003 12:46 208127

CyberDaemon Биг спасиба!


Время: 05:15.

Время: 05:15.
© OSzone.net 2001-