|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Запуск пакетного файла (ShellExecute)
Есть пакетный(.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 ЗАГОЛОВОК Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось 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 - прога не запущена. Если нашёл - гаси. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 03.04.2009 в 21:52. |
#10
|
||||
|
||||
Цитата:
Эта команда удаляет запущенный файл)))) Разумеется, если запущен через BAT - с командной строкой ничё не будет. Но если введёшь в коммандной строке... Прощай cmd.exe)) Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 03.04.2009 в 21:52. |
#11
|
||||
|
||||
Можно еще просмотреть параметры, с которыми был запущен конкретный cmd.exe.
Код:
Но если введёшь в коммандной строке... Прощай cmd.exe)) ...сказал, и загрустил от бесспорной своей правоты |
#12
|
|||
|
|||
Цитата:
|
#13
|
||||
|
||||
Ну, я скажу одно: у кого Windows XP Hacker Edition (в сети не ищите, она редко где есть), и пропатченые файлы, у того удалится в лёт. Я этот файлик забэкапил (на всякий пожарный) и прописал: пришлось восстанавливать. Если не работает у одного - не значит, что не будет работать ни у кого. Короче: просто НЕ рекоммендую этого делать.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#14
|
||||
|
||||
[quote="Hatchet" Harry]Каким образом?[/QUOTE]
Я бы тоже это хотел знать, но ProcessExplorer Марка Руссовича это делает. [COLOR="Gray"]зы. Все у кого Windows XP 0nni Edition не рекомендую нажимить ctrl+alt+space.[/color] ...сказал, и загрустил от бесспорной своей правоты |