Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

Как предотвратить повторные запуски ДОС программ?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.049 c
1-1084944309
IrBisoff
2004-05-19 09:25
2004.05.30
MouseEnter &amp; MouseLeave


1-1084654146
saNat
2004-05-16 00:49
2004.05.30
CGI приложение.


14-1084264874
slaga
2004-05-11 12:41
2004.05.30
] Я вот хочу начать изучать COM технологию, хотел спросить может


14-1084259698
Ega23
2004-05-11 11:14
2004.05.30
Сразу вопрос. Правда по VC++ :o)


3-1084352372
chtr
2004-05-12 12:59
2004.05.30
Как разом вставить все записи из одного TADOQuery в другой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский