Форум по 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.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter