Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск внешнего приложения, с параметрами командной строки 
:(
    Опции темы
Dom
Дата 25.3.2011, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Задача такая. Запустить консольное приложение с набором параметров командной строки. Дождаться завершения. Запустить следующее консольное приложение и т.д.

Пробовал ShellExecute, WinExec, CreateProcess - не получается.

Вот есть такой код, процедура ExecAndWait позаимствована у Akella
Код

procedure TForm1.Button1Click(Sender: TObject);

function ExecAndWait(const FileName, Params: string; ArcDir:string;
                               const WinState: Word): boolean; export;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: String;
begin
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do
  begin
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    wShowWindow := WinState;
  end;
  Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ArcDir), StartInfo, ProcInfo);
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;

var
  ExeFileName, Params, Dir: string;
begin
  ExeFileName := 'D:\INSTALL\Math\libSVM\libsvm-3.0\windows\svm-scale.exe';
  Params := '-l 0 -u 1 -s D:\temp\libtest\1.svm.train0.range D:\temp\libtest\1.svm.train0 > D:\temp\libtest\1.svm.train0.scaled';
  Dir := 'D:\temp\libtest\';
  ExecAndWait(ExeFileName, Params, Dir, 0);
end;


Формируется правильный CmdLine, но при вызове CreateProcess ничего не происходит, приложение не запускается, новые файлы не создаются.
Если строку полученную в CmdLine скопировать и вставить вручную в командную строку, то все отрабатывает корректно. Т.е. проблема где-то в самом  вызове. Подтолкните пожалуйста в нужное направление, ибо силы уже на исходе...
Наверняка какую-то мелочь пропустил...
PM MAIL   Вверх
uwannadie
Дата 25.3.2011, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



попробуй такой код:
Код

function WinExecute(CmdLine: string; Wait: Boolean): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInformation: TProcessInformation;
begin
  Result := True;
  try
    FillChar(StartupInfo, SizeOf(StartupInfo), 0);
    StartupInfo.cb := SizeOf(StartupInfo);
    StartupInfo.wShowWindow := SW_SHOWMINIMIZED;
    if not CreateProcess(nil, PChar(CmdLine), nil, nil, False, CREATE_NO_WINDOW, nil, //тут окошко делается инвизовым, поменять при надобности
    nil, StartupInfo, ProcessInformation) then
      RaiseLastWin32Error;
    if Wait then
      WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
  except
    Result := False;
  end;
end;

у меня по-крайней мере запускалось без ошибок и отрабатывало несколько десятков тысяч раз за один запуск программы   smile 
p.s. код может изначально и был от Акеллы, но найден в просторах тырнета, так что чесно хз чей smile 

Это сообщение отредактировал(а) uwannadie - 25.3.2011, 22:45
--------------------
PM MAIL   Вверх
Dom
Дата 26.3.2011, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Спасибо, но не помогло...
Процесс как и прежде не запускается, по крайней мере я не вижу его в ProcessExplorer'е
Будем думать дальше.
PM MAIL   Вверх
uwannadie
Дата 28.3.2011, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



а Вы уверены, что вообще дело доходит до запуска?
--------------------
PM MAIL   Вверх
Данкинг
Дата 28.3.2011, 10:51 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Domвот там глянь-таки на мой пример. Вдруг он тебе поможет. В отличие от CreateProcess. 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
CodeMonkey
Дата 28.3.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Меня вот это смущает: '>' (это в командной строке). Выглядит очень подозрительно. Я сомневаюсь, что это параметр к программе.

Это часом вы не перенаправление вывода сделать хотите?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
uwannadie
Дата 29.3.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(CodeMonkey @  28.3.2011,  20:26 Найти цитируемый пост)

Это часом вы не перенаправление вывода сделать хотите? 

кстати да, если перенаправление, то тут, увы, ничего не выйдет, ибо перенаправление вывода консоли умеет делать только сама консоль.
для примера попробуйте скомпилировать это:
Код

program Project1;
uses
  SysUtils ,Windows, ShellAPI;

begin
  try
    ShellExecute(GetDesktopWindow, 'open', 'ping.exe', 'ya.ru > d:\result.txt','', SW_NORMAL);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

на диске D ничего не появится smile 

Это сообщение отредактировал(а) uwannadie - 29.3.2011, 11:25
--------------------
PM MAIL   Вверх
CodeMonkey
Дата 29.3.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(uwannadie @  29.3.2011,  12:24 Найти цитируемый пост)
ничего не выйдет


Отчего же. Вполне выйдет. И даже несколькими способами.

Например, через hStdOutput. Или вызовом через CMD.

Но для начала надо точно уточнить, что автор темы хочет сделать.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
uwannadie
Дата 29.3.2011, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(CodeMonkey @  29.3.2011,  11:32 Найти цитируемый пост)
Например, через hStdOutput. Или вызовом через CMD.

имелся ввиду способ вышеописанными процедурами и функциями
--------------------
PM MAIL   Вверх
CodeMonkey
Дата 29.3.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Непонятно, а что не так с вышеуказанными функциями? hStdOutput - это параметр у StartupInfo для CreateProcess. Берём и указываем.

Или имелось ввиду без модификации кода выше? Ну, способ с hStdOutput без модификации - да, нельзя. Хотя в первом примере даже STARTF_USESTDHANDLES есть (но почему-то нет установки самих описателей. Кто это писал? Пристрелить на месте!  smile  ).

Способ через CMD - вполне. Скажем:

Код
var
  Cmd: String;
begin
  Cmd := ExpandEnviromentString('ComSpec'); // Cmd = 'C:\Windows\system32\cmd.exe';

  ExecAndWait(Cmd, '/C echo > D:\Test.txt', 'C:\', SW_NORMAL);
  // или:
  WinExecute(Format('"%s" /C echo > D:\Test.txt', [Cmd]), True);
end;



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
uwannadie
Дата 29.3.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(CodeMonkey @  29.3.2011,  13:11 Найти цитируемый пост)
Или имелось ввиду без модификации кода выше

именно это и имелось ввиду.
Цитата(CodeMonkey @  29.3.2011,  13:11 Найти цитируемый пост)
 Кто это писал? Пристрелить на месте! 

если Вы имелли ввиду то, что выкладывал я, то оно нарыто гуглом в просторах инета  smile 
--------------------
PM MAIL   Вверх
northener
Дата 30.3.2011, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(uwannadie @  29.3.2011,  18:42 Найти цитируемый пост)
если Вы имелли ввиду то, что выкладывал я, то оно нарыто гуглом в просторах инета 

Имхо, CodeMonkey имеет в виду код в вопросе автора. Но "пристрелить на месте" уважаемого автора (к тому же модератора) я не советовал бы. smile


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1069 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.