Текущий архив: 2004.05.30;
Скачать: CL | DM;
ВнизКак предотвратить повторные запуски ДОС программ? Найти похожие ветки
← →
nv_ © (2004-04-27 14:42) [0]Доброе время суток, Мастера, подмастерья и прочий захожий люд ;)))
У меня возникла надобность предотвратить повторные запуски некоторых ДОСовских программ. А так, как я в этом вопросе не мастер, не подмастер, то подскажите мне пожалуста:
1. Как отловить запуск программы ххх.ехе?
2. Как попробовать найти её уже запущенную (первую) копию?
3. Как заставить вторую копию завершиться без всяких вопросов?
4. Как заставить первую копию показаться (Showнуться)?
Спасибо за внимание.
← →
Vlad Oshin © (2004-04-27 15:24) [1]Как попробовать найти её уже запущенную (первую) копию?
--------------------------------------------------------------------------------
Доброе время суток, господа! Беспокоит Вас один из начинающих пользователей Delphi по следующему вопросу : Как определить выполняется ли определенная задача (exe - файл) (находится ли процесс в списке выполнения) в данное время в ОС Windows (9x, NT, 2000)? На круглом столе был похожий вопрос о нахождении Windows - окна по его заголовку. Но это не много другое, т.к. еxe - файл может выполняться и без окна, а если запущено консольное приложение, то заголовок окна может быть любым (имя ярлыка, полное имя файла - откуда был запущен). Очень буду рад за оказанную помощь.
--------------------------------------------------------------------------------
Oтветить на вопрос по почте
Ответов - 3 :
Почитал предыдущий ответ Вот искаем "SQL32.EXE", писал вчера, вариант пробный только для ВИН 95/98. unit Est_SQL; interface function PresentSQL:byte; implementation uses SysUtils, Classes, TlHelp32, Windows; function PresentSQL:byte; var j:integer; Snap:tHandle; lpp:tProcessEntry32; s:string; begin j:=0; Snap:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0); if Snap=-1 then begin result:=100; CloseHandle(Snap); Exit; end; lpp.dwSize:=SizeOf(tProcessEntry32); Process32First(Snap,lpp); s:=lpp.szExeFile; if (Pos("SQL32.EXE",S)<>0) then j:=1; While Process32Next(Snap,lpp) do begin s:=lpp.szExeFile; if (Pos("SQL32.EXE",S)<>0) then j:=1; end; CloseHandle(Snap); if j=1 then Result:=1 else Result:=0; end; end.
RV
Почитайте главу 14 из книги С. Тейксейра, К. Пачеко http://delphi.mtu-net.ru/library/index.htm#link3
Почитайте главу 14 из <a href="http://delphi.mtu-net.ru/library/index.htm#link3"> книги С. Тейксейра, К. Пачеко </a>
процессы в НТ
PThreadInfo = ^TThreadInfo;
TThreadInfo = record
ftCreationTime : TDateTime;
dwUnknown1 : DWORD;
dwStartAddress : DWORD;
dwOwningPID : DWORD;
dwThreadID : DWORD;
dwCurrentPriority : DWORD;
dwBasePriority : DWORD;
dwContextSwitches : DWORD;
dwThreadState : DWORD;
dwUnknown2 : DWORD;
dwUnknown3 : DWORD;
dwUnknown4 : DWORD;
dwUnknown5 : DWORD;
dwUnknown6 : DWORD;
dwUnknown7 : DWORD;
end;
PProcessInfo = ^TProcessInfo;
TProcessInfo = record
dwOffset : DWORD;
dwThreadCount : DWORD;
dwUnkown1 : array [1..6] of DWORD;
ftCreationTime : TDateTime;
dwUnkown2 : DWORD;
dwUnkown3 : DWORD;
dwUnkown4 : DWORD;
dwUnkown5 : DWORD;
dwUnkown6 : DWORD;
pszProcessName : PWideChar;
dwBasePriority : DWORD;
dwProcessID : DWORD;
dwParentProcessID : DWORD;
dwHandleCount : DWORD;
dwUnkown7 : DWORD;
dwUnkown8 : DWORD;
dwVirtualBytesPeak : DWORD;
dwVirtualBytes : DWORD;
dwPageFaults : DWORD;
dwWorkingSetPeak : DWORD;
dwWorkingSet : DWORD;
dwUnkown9 : DWORD;
dwPagedPool : DWORD;
dwUnkown10 : DWORD;
dwNonPagedPool : DWORD;
dwPageFileBytesPeak : DWORD;
dwPageFileBytes : DWORD;
dwPrivateBytes : DWORD;
dwUnkown11 : DWORD;
dwUnkown12 : DWORD;
dwUnkown13 : DWORD;
dwUnkown14 : DWORD;
ati : array [1..1] of TThreadInfo;
end;
TNtQSI = function(Nmb: integer; Ptr: Pointer; Size1, Size2: integer): DWORD; stdcall;
var
Form1: TForm1;
NtQSI : TNtQSI;
Buf : array [1..20480] of char;
ThrInfo : PThreadInfo;
PrcInfo : PProcessInfo;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var hLib : DWORD;
Ptr : Pointer;
Cur : DWORD;
begin
lb.Items.Clear;
hLib := LoadLibrary("NTDLL.DLL");
if hLib>0 then
begin
@NtQSI := GetProcAddress(hLib,"NtQuerySystemInformation");
NtQSI(5,@Buf,20480,0);
Cur := 1;
Ptr := Addr(Buf[Cur]);
PrcInfo := Ptr;
lb.Items.Add(PrcInfo.pszProcessName+" -----> PID : "+ IntToStr(PrcInfo.dwProcessID));
repeat
Cur := Cur + PrcInfo.dwOffset;
Ptr := Addr(Buf[Cur]);
PrcInfo := Ptr;
lb.Items.Add(PrcInfo.pszProcessName+" -----> PID : "+ IntToStr(PrcInfo.dwProcessID));
until PrcInfo.dwOffset=0;
end;
FreeLibrary(hLib);
end;
end.
← →
Imageman (2004-04-28 11:03) [2]
> У меня возникла надобность предотвратить повторные запуски
> некоторых ДОСовских программ
а программы твои? И в TP написаны?
Если твои, то самое простое, это попытаться через файлы.
Если программы на дельфях, то вышеприведенное должно помочь.
Если программы не твои, то тут уже трудно что-нибудь сделать. Разве что loader применить. Что-нибудь вроде того: на дельфях пишешь консольную (или не консольную) программу, которая занимается слежением за числом запусков. Если число запусков 0, то она запускает DOS программу. В противном случае делает попытку найти окно с программой.
← →
nv_ © (2004-05-06 12:44) [3]Спасибо за ответы, но ...
попытался поюзать такое
procedure KillProcess(list:TStrings);
var
hSnapshoot: THandle;
pe32: TProcessEntry32;
progHandle: THandle;
CheckArr : array of THandle;
i : integer;
begin
SetLength(CheckArr,list.Count);
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) then
repeat
if list.IndexOf((StrPas(pe32.szExeFile)))<>-1 then
begin
if CheckArr[list.IndexOf((StrPas(pe32.szExeFile)))] <> 0 then
begin
progHandle := OpenProcess(PROCESS_ALL_ACCESS, True, pe32.th32ProcessID);
TerminateProcess(progHandle,0);
end else
CheckArr[list.IndexOf((StrPas(pe32.szExeFile)))]:=
OpenProcess(PROCESS_ALL_ACCESS, True, pe32.th32ProcessID);
end;
until not Process32Next(hSnapshoot, pe32);
CloseHandle (hSnapshoot);
for i:=0 to list.Count-1 do
if CheckArr[i]<>0 then
CloseHandle(CheckArr[i]);
CheckArr:=nil;
end;
В list храняться имена процессов.
Работает, но только с виндовскими прогами, а с ДОСом не дружит.
Под 2000 (я сижу на ней а проги пишу под 98-95) при запуске ДОСпроги видно только NTVDM.EXE, а под 98 C:\WINDOWS\SYSTEM\WINOA386.MOD.
Вот процедура заполнения списка процессов, если нужно.
procedure TfrmProcView.FormCreate(Sender: TObject);
var
hSnapshoot: THandle;
pe32: TProcessEntry32;
begin
JvListBox1.Items.Clear;
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) then
repeat
JvListBox1.Items.Add(pe32.szExeFile);//+", "+IntToStr(pe32.th32ProcessID));
until not Process32Next(hSnapshoot, pe32);
CloseHandle (hSnapshoot);
JvLabel1.Caption := Format("Просесів: %d", [jvListBox1.Items.Count]);
end;
Подскажите как получить имена не процессов, а приложений. Как в TaskListe
Спасибо за внимание.
← →
Vlad Oshin © (2004-05-06 14:19) [4]Окошки что-ли?
Ну, перебирать их нужно, сравнивать с чем надо, примерно так
function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
Var
Nm:Array[0..255] of Char;
ZNAME:string;
Begin
If Wd<>Form1.Handle then // если это не наша программа
If IsWindowVisible(WD) then // если окно видимо
If not IsIconic(WD) then // если окно не свернуто
If isWindow(WD) then begin // и вообще это - окно.
GetWindowText(Wd,Nm,255);
ZName:=AnsiUpperCase(String(Nm));
If Pos("INTERNET EXPLORER",zName)<>0 then SendMessage(WD,WM_SYSCOMMAND,SC_CLOSE,0);
end;
EnumProc := TRUE; // продолжаем перебирать все окна системы.
end;
procedure TForm1.Button1Click(Sender: TObject); // допустим, закрываем по нажатию на клавишу
begin
EnumWindows (@EnumProc, 0); // отрабатываем сворачивание окон.
end;
← →
PVOzerski © (2004-05-11 14:17) [5]Ничего, кроме файлов, не остается. Потому как в NT-системах для списка процессов есть NTVDM.EXE и никаких DOS-приложений. Я бы только еще держал контрольный файл всё время открытым и проверял не только наличие но и возможность доступа к нему, потому как если DOS-прога вылетит нештатно и за собой мусор не уберет...
Страницы: 1 вся ветка
Текущий архив: 2004.05.30;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.037 c