![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть пакетный(.bat) файл, который имеет такой вид:
Код:
"с:\abcd\abc.exe" -a ... -b ... "с:\abcd\abc.exe" -a ... -b ... ... пытаюсь так: Код:
ShellExecute(HInstance, 'open', PChar(FPEdit.Text), nil, nil, SW_SHOWNORMAL); // FPEdit.Text - содержит полный путь к файлу Код:
Папка, откуда была запущена программа>"с:\abcd\abc.exe" -a ... -b ... Системе не удается найти указанный путь Папка, откуда была запущена программа>"с:\abcd\abc.exe" -a ... -b ... Системе не удается найти указанный путь ... |
|
#2
|
|||
|
|||
|
"Hatchet" Harry, нет, код рабочий. Проверила на ping.exe =)))) Вот такой bat-ник.
Код:
"c:\windows\system32\ping.exe" -t 127.0.0.1 Так что скорее всего, дело не в программе, а в путях или еще в чём-то... Попробуйте для контроля тоже с ping.exe. Если не пройдет, то не знаю пока. |
|
#3
|
|||
|
|||
|
хм... да, действительно код рабочий! Ошибка была непосредственно в .bat файле, - был 1 параметр, который использовал папку без полного пути (т.е. папка искалась там, откуда запускалась программа, а не рядом с .bat файлом, где она была на самом деле). Следовательно нужно задать SetCurrentDir('папка .bat файла'); или использовать CreateProcess(...,CurrentDirectory,...);
|
|
#4
|
||||
|
||||
|
А попробуйте так:
Код:
ShellExecute(HInstance, 'open', PChar(FPEdit.Text), nil, PChar(ExtractFileDir(FPEdit.Text)), SW_SHOWNORMAL); // FPEdit.Text - содержит полный путь к файлу ой! не заметил последний ответ. ![]() Последний раз редактировалось 0nni, 01.04.2009 в 09:08. |
|
#5
|
|||
|
|||
|
Вот еще такой вопросик назрел, как можно отследить выполнение пакетного (.bat) файла подобного(первый пост) содержания. Например мне нужно убить этот файл, если он выпоняется. Но непосредственно сам .bat-файл не убьёшь, т.к. как только он запускается, написанные в нём команды построчно передаются процессу cmd.exe а сам .bat-файл в процессах не отображается(т.е. он как бы в память к cmd.exe подгружается). Следовательно нужно гасить cmd.exe. По имени процесса или по хендлу окна убивать не вариант, т.к. если, допустим в это же время выполняется какой-нить другой процесс cmd.exe то он тоже убьётся(имена и хэндлы окон у двух запущенных cmd.exe будут одинаковы). Как обнаружить именно нужный cmd.exe (выполнение которого вызвал .bat-файл)
Если нужно по имени процесса убить, то пользовал такую функцию: Код:
function KillTask(ExeFileName:string):integer; const PROCESS_TERMINATE=$0001; var Co:BOOL; FS:THandle; FP:TProcessEntry32; begin result:=0; FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); FP.dwSize:=Sizeof(FP); Co:=Process32First(FS,FP); while integer(Co) <> 0 do begin if ((UpperCase(ExtractFileName(FP.szExeFile))=UpperCase(ExeFileName)) or (UpperCase(FP.szExeFile)=UpperCase(ExeFileName))) then Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FP.th32ProcessID),0)); Co:=Process32Next(FS,FP); end; CloseHandle(FS); end; |
|
#6
|
||||
|
||||
|
В батник пропиши
Код:
title ЗАГОЛОВОК Последний раз редактировалось PhoeniX, 03.04.2009 в 21:52. |
|
#7
|
||||
|
||||
|
Запускй bat через CreaateProcess(). Тогда получишь PID запущенного процесса и легкл миожешь его "убить"
Код:
program Project1;
{$APPTYPE CONSOLE}
uses
windows;
var sInf : TStartupInfo;
pInf : TProcessInformation;
begin
ZeroMemory(@sInf, sizeof(sInf));
CreateProcess('c:\windows\system32\calc.exe', 'OPEN', nil, nil, true, 0, nil, nil, sInf, pInf);
if WaitForSingleObject(pInf.hProcess, 3000) = WAIT_TIMEOUT then
TerminateProcess(pInf.hProcess, 0)
end._____ И кстати, ты такой батник пробовал делать? Код:
del %0 Последний раз редактировалось 0nni, 03.04.2009 в 19:26. |
|
#8
|
|||
|
|||
|
Цитата:
Цитата:
. Меня интереует немного другая задача:Есть пакетный .bat-файл; Известно его название, полный путь к нему, даже его содержание известно и он возможно был запущен в рандомный момент времени нам нужно узнать исполняется ли он в данный момент и если да то убить, не задев при этом соседние процессы cmd.exe. |
|
#9
|
||||
|
||||
|
Читай про функцию FindWindow...
Код:
hWnd:=FindWondow(nil,'ЗАГОЛОВОК'); Если не найдёт hWnd - прога не запущена. Если нашёл - гаси. Последний раз редактировалось PhoeniX, 03.04.2009 в 21:52. |
|
#10
|
||||
|
||||
|
Цитата:
Эта команда удаляет запущенный файл)))) Разумеется, если запущен через BAT - с командной строкой ничё не будет. Но если введёшь в коммандной строке... Прощай cmd.exe)) Последний раз редактировалось PhoeniX, 03.04.2009 в 21:52. |
|
#11
|
||||
|
||||
|
Можно еще просмотреть параметры, с которыми был запущен конкретный cmd.exe.
Код:
Но если введёшь в коммандной строке... Прощай cmd.exe)) |
|
#12
|
|||
|
|||
|
Цитата:
|
|
#13
|
||||
|
||||
|
Ну, я скажу одно: у кого Windows XP Hacker Edition (в сети не ищите, она редко где есть), и пропатченые файлы, у того удалится в лёт. Я этот файлик забэкапил (на всякий пожарный) и прописал: пришлось восстанавливать. Если не работает у одного - не значит, что не будет работать ни у кого. Короче: просто НЕ рекоммендую этого делать.
|
|
#14
|
||||
|
||||
|
[quote="Hatchet" Harry]Каким образом?[/QUOTE]
Я бы тоже это хотел знать, но ProcessExplorer Марка Руссовича это делает. [COLOR="Gray"]зы. Все у кого Windows XP 0nni Edition не рекомендую нажимить ctrl+alt+space.[/color] |