Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.03.2009, 21:25
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию Запуск пакетного файла (ShellExecute)

Есть пакетный(.bat) файл, который имеет такой вид:
Код:
"с:\abcd\abc.exe" -a ... -b ...
"с:\abcd\abc.exe" -a ... -b ...
...
Нужно его запустить из программы;
пытаюсь так:
Код:
ShellExecute(HInstance, 'open', PChar(FPEdit.Text), nil, nil, SW_SHOWNORMAL); // FPEdit.Text - содержит полный путь к файлу 
выскакивает cmd.exe:
Код:
Папка, откуда была запущена программа>"с:\abcd\abc.exe" -a ... -b ...
Системе не удается найти указанный путь
Папка, откуда была запущена программа>"с:\abcd\abc.exe" -a ... -b ...
Системе не удается найти указанный путь
...
Подскажите, что делаю не так? Пробовал еще CreateProcess и WinExec - те же грабли (
Ответить с цитированием
  #2  
Старый 31.03.2009, 21:51
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

"Hatchet" Harry, нет, код рабочий. Проверила на ping.exe =)))) Вот такой bat-ник.
Код:
"c:\windows\system32\ping.exe" -t 127.0.0.1
ShellExecute запускает нормально и пингуется стабильно.
Так что скорее всего, дело не в программе, а в путях или еще в чём-то...
Попробуйте для контроля тоже с ping.exe. Если не пройдет, то не знаю пока.
Ответить с цитированием
  #3  
Старый 31.03.2009, 22:20
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

хм... да, действительно код рабочий! Ошибка была непосредственно в .bat файле, - был 1 параметр, который использовал папку без полного пути (т.е. папка искалась там, откуда запускалась программа, а не рядом с .bat файлом, где она была на самом деле). Следовательно нужно задать SetCurrentDir('папка .bat файла'); или использовать CreateProcess(...,CurrentDirectory,...);
Ответить с цитированием
  #4  
Старый 01.04.2009, 09:06
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

А попробуйте так:
Код:
ShellExecute(HInstance, 'open', PChar(FPEdit.Text), nil, PChar(ExtractFileDir(FPEdit.Text)), SW_SHOWNORMAL); // FPEdit.Text - содержит полный путь к файлу 
_________
ой! не заметил последний ответ.
__________________
...сказал, и загрустил от бесспорной своей правоты

Последний раз редактировалось 0nni, 01.04.2009 в 09:08.
Ответить с цитированием
  #5  
Старый 03.04.2009, 18:58
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Вот еще такой вопросик назрел, как можно отследить выполнение пакетного (.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  
Старый 03.04.2009, 19:07
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

В батник пропиши
Код:
title ЗАГОЛОВОК
и гаси по имени окна.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 03.04.2009 в 21:52.
Ответить с цитированием
  #7  
Старый 03.04.2009, 19:16
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Запускй 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.
Тут если калькулятор сам не завершится через 3 секунды, его принудительно завершат.
_____
И кстати, ты такой батник пробовал делать?
Код:
del %0
__________________
...сказал, и загрустил от бесспорной своей правоты

Последний раз редактировалось 0nni, 03.04.2009 в 19:26.
Ответить с цитированием
  #8  
Старый 03.04.2009, 21:15
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Цитата:
Сообщение от popyurv
В батник пропиши
Код:
title ЗАГОЛОВОК
и гаси по имени окна.
Цитата:
Сообщение от 0nni
Запускй bat через CreaateProcess(). Тогда получишь PID запущенного процесса и легкл миожешь его "убить"
Не, это-то всё понятно... Извините, что ввёл в заблуждение, не верно сформулировав свой вопрос . Меня интереует немного другая задача:
Есть пакетный .bat-файл; Известно его название, полный путь к нему, даже его содержание известно и он возможно был запущен в рандомный момент времени нам нужно узнать исполняется ли он в данный момент и если да то убить, не задев при этом соседние процессы cmd.exe.
Ответить с цитированием
  #9  
Старый 03.04.2009, 21:36
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Читай про функцию FindWindow...
Код:
hWnd:=FindWondow(nil,'ЗАГОЛОВОК');
И дальше творишь с этим окном что хочеш. Как-то вроде даже убить можно.
Если не найдёт hWnd - прога не запущена.
Если нашёл - гаси.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 03.04.2009 в 21:52.
Ответить с цитированием
  #10  
Старый 03.04.2009, 21:39
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от 0nni
И кстати, ты такой батник пробовал делать?
Код:
del %0
Автор, не дай бог тебе это в командной строке испытать...
Эта команда удаляет запущенный файл))))
Разумеется, если запущен через BAT - с командной строкой ничё не будет. Но если введёшь в коммандной строке... Прощай cmd.exe))
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 03.04.2009 в 21:52.
Ответить с цитированием
  #11  
Старый 03.04.2009, 23:12
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Можно еще просмотреть параметры, с которыми был запущен конкретный cmd.exe.
Код:
Но если введёшь в коммандной строке... Прощай cmd.exe))
Я для чистоты экспремента написал так 10 раз... пишет что файла %0 не найден, да и как запущеный эксешник себя удалить может? (может конечно, но "чистыми" методами никак).
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
  #12  
Старый 03.04.2009, 23:15
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Цитата:
Сообщение от 0nni
Можно еще просмотреть параметры, с которыми был запущен конкретный cmd.exe.
Каким образом?
Ответить с цитированием
  #13  
Старый 03.04.2009, 23:15
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ну, я скажу одно: у кого Windows XP Hacker Edition (в сети не ищите, она редко где есть), и пропатченые файлы, у того удалится в лёт. Я этот файлик забэкапил (на всякий пожарный) и прописал: пришлось восстанавливать. Если не работает у одного - не значит, что не будет работать ни у кого. Короче: просто НЕ рекоммендую этого делать.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #14  
Старый 03.04.2009, 23:31
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

[quote="Hatchet" Harry]Каким образом?[/QUOTE]
Я бы тоже это хотел знать, но ProcessExplorer Марка Руссовича это делает.
[COLOR="Gray"]зы. Все у кого Windows XP 0nni Edition не рекомендую нажимить ctrl+alt+space.[/color]
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter