Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Вниз

Получение информации о процессах под NT!!!!!!!! 


skywalker   (2002-02-15 13:20) [0]

Наконец то я доконал эту функцию... Предлагаю на ваше суждение исходник. Может кому нить поможет.... :)


Эта функция возвращает true, если запущено больше одного процесса с одного и того же модуля с именем Exename, но вы можете легко переделать эту функцию под свои нужды.

function CheckOutExeNT(Exename:string):boolean;
type
TEnumProcesses=function(lpidProcess:LPDWORD; cb:DWORD; var cbNeeded:DWORD):bool stdcall;
TEnumProcessModules=function(hProcess:THandle; lphModule:LPDWORD; cb:DWORD; var lpcbNeeded:DWORD):bool stdcall;
TGetModuleFileNameExA=function(hProcess:THandle; hModule:HMODULE;lpFilename:PAnsiChar; nSize:DWORD):DWORD stdcall;
var
EnumProcesses:TEnumProcesses;
EnumProcessModules:TEnumProcessModules;
GetModuleFileNameExA:TGetModuleFileNameExA;
hPSAPI:THandle;
Counter,Counter1,Counter2:longword;
PIDs:array[0..1023] of dword;
pbNeeded:dword;
ProcHandle:THandle;
ModHndls:array[0..1023] of dword;
mbNeeded:dword;
ModulePath,ModuleName:string;
PathLen:byte;
Error:integer;
FoundInstances:word;
begin
Result:=false;
FoundInstances:=0;
hPSAPI:=LoadLibrary("PSAPI.dll");
if hPSAPI<32 then
begin
Result:=false;
Exit
end;
EnumProcesses:=GetProcAddress(hPSAPI, "EnumProcesses");
EnumProcessModules:=GetProcAddress(hPSAPI, "EnumProcessModules");
GetModuleFileNameExA:=GetProcAddress(hPSAPI, "GetModuleFileNameExA");
EnumProcesses(@PIDs,Length(PIDs),pbNeeded);
for Counter:=0 to (pbNeeded div 4)-1 do
begin
ProcHandle:=OpenProcess(PROCESS_QUERY_INFORMATION+PROCESS_VM_READ,false,PIDs[Counter]);
if Prochandle<>0 then
begin
if EnumProcessModules(ProcHandle,@ModHndls,Length(ModHndls),mbNeeded) then
for Counter1:=0 to (mbNeeded div 4)-1 do
begin
ModulePath:="";
ModuleName:="";
SetLength(ModulePath,MAX_PATH);
PathLen:=GetModuleFileNameExA(ProcHandle,ModHndls[Counter1],pchar(ModulePath),MAX_PATH);
ModulePath:=Copy(ModulePath,1,PathLen);
for Counter2:=PathLen downto 1 do
begin
if ModulePath[Counter2]="\" then break;
ModuleName:=ModulePath[Counter2]+ModuleName
end;
if UpperCase(ModuleName)=Exename then
begin
FoundInstances:=FoundInstances+1;
if FoundInstances>1 then
begin
Result:=true;
break
end
end
end;
CloseHandle(ProcHandle);
end;
if Result then break
end;
FreeLibrary(hPSAPI)
end;



Alx2   (2002-02-15 14:08) [1]

Спасибо! Из предыдущих обсуждений выяснилось, что kernel32.dll не всегда содержит CreateToolhelp32Snapshot. А это решение, видимо, универсальное.



Alx2   (2002-02-15 14:33) [2]

>skywalker ©
Я так понял, тебе это нужно было для определения факта повторного запуска твоей программы?



skywalker   (2002-02-15 15:00) [3]

да, потому что она с сокетом работает



drpass   (2002-02-15 15:35) [4]

Все хорошо, только модуль psapi.pas с декларациями этих функций входит в стандартную поставку любой версии Delphi :)



Bachin   (2002-02-15 15:41) [5]

2skywalker:
Ну тогда ты полный извращенец! нет чтобы просто сигнал взводить! :)))
SignalID := TEvent.Create( NIL, False, True, "LetChaosIsBegining" );
if SignalID.WaitFor( 15 ) <> wrSignaled then
begin
SignalID.SetEvent; // это сигнал той, что была запущена
Exit;
end;



skywalker   (2002-02-15 15:46) [6]

Сорри, с ивентами не работал... :) надо порпобовать как-нить



skywalker   (2002-02-15 15:47) [7]

я знаю (насчет psapi.pas), просто из-за одного раза модуль подключать неохота




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.047 c
14-57871          DFG                   2002-03-11 21:27  2002.04.18  
Кто-то устанавливал Delphi на карманный компьютер?


1-57721           esprit_bel            2002-04-05 08:27  2002.04.18  
Звездное поле


3-57605           mad0max               2002-03-27 04:49  2002.04.18  
XL Report


3-57581           Ninelle               2002-03-26 16:29  2002.04.18  
lookup в wwdbgrid


14-57845          Tpv                   2002-03-06 23:12  2002.04.18  
Зависание программы.