Страница 1 из 2
TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 08:19:52
KOL48
Здравствуйте.
Задача: запустить внешнюю программу, путь к которой содержит пробелы. Например: C:\Program Files\Internet Explorer\iexplore.exe.
Пытаюсь запустить через TProcess:
Код: Выделить всё
procedure runapp;
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := 'C:\Program Files\Internet Explorer\iexplore.exe';
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;
Получаю уведомление об исключении отладчика: "Project project1.exe raised exception class 'EProcess' with message: Failed to execute C:\Program Files\Internet Explorer\iexplore.exe : 5".
Думаю, что проблема в том, что из-за пробелов в пути не находится iexplore.exe. Потому что программа без пробелов в пути (C:\WINDOWS\notepad.exe) прекрасно запускается.
Пытался брать путь в двойные кавычки, в две и три одинарные кавычки -- iexplore.exe не запускается.
Подскажите, как правильно запускать внешние программы с пробелами в путях.
Спасибо.
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 09:51:54
Vadim
KOL48 писал(а):Подскажите, как правильно запускать внешние программы с пробелами в путях.
Точно такое же, как если бы Вы эту программу запускали в консоли - обрамить путь кавычками. Других путей ещё не придумали. Или пишите вместо длинных имён короткие.
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 09:57:58
Maxizar
Какая версия Lazarus?.. У меня 0.9.29 SVN: 29368 (Декабрь наверно, давно не обновлял).
Делаю так:Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, process, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
Procedure RunProg(Const ProgName:String);
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := UTF8ToSys(ProgName);
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
//RunProg('c:\wavGenerator_ver1.1\WaveGenerator.exe')
//RunProg('C:\Program Files\Internet Explorer\iexplore.exe http://yandex.ru')
RunProg('C:\Program Files\Internet Explorer\iexplore.exe')
//RunProg('c:\привет\WaveGenerator.exe')
end;
end.
Все программы из списка запускаются... и ни каких ковычек и все такое... даже страница яндекса открылась...
Скорее всего вам стоит обновить Lazarus,
качать тут
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 11:58:36
KOL48
Скачал Lazarus-0.9.31-29791-fpc-2.4.2-20110311-win32.exe. Удалил прежний, поставил новый.
Твой проект у меня не запускается с прежней ошибкой.
Файл C:\Program Files\Internet Explorer\iexplore.exe присутствует. Запускал его, поместив эту строку в диалог "Пуск" - "Выполнить".
ОC: Windows XP SP3. Твиками системы не увлекаюсь.
Переменные среды по команде "set path" (может, здесь что не так?): Path=C:\Perl\site\bin;C:\Perl\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;c:\tools\ALIAS;C:\Program Files\Windows Imaging\;C:\PROGRA~1\Borland\Delphi6\Bin;C:\PROGRA~1\Borland\Delphi6\Projects\Bpl;C:\fox\;C:\tools\ARCH
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.LNK
Посоветуйте, пожалуйста, выход из ситуации.
Спасибо.
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 12:11:04
Maxizar
Очень странно... а можете выложить свой проект, для уменьшения веса, удалите иконку из проекта перекомпильте, удалите все не нужные папки... и запакуйте в архив Zip, приложите к ответу, в раздел вложения... Посмотрим, если у меня будет работать... то у вас что то загадочное...
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 12:20:31
KOL48
Maxizar писал(а):Очень странно... а можете выложить свой проект
Для чистоты эксперимента, скачал проект из третьего сообщения в этой теме, о котором уважаемый
Maxizar сказал, что запускается.
У меня не завёлся даже он.
Попробуйте запустить его у себя.
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 12:24:28
Снег Север
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := UTF8ToSys(Edit1.Text);
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;
Ввожу в text
C:\Program Files\Internet Explorer\iexplore.exe
и у меня прекрасно запускается - vista x64, Lazarus 0.9.31 из сборки от CodeTyphon (я другими никогда пользоваться не пробовал).
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 12:30:16
Maxizar
KOL48 писал(а):Попробуйте запустить его у себя.

Так я его для вас и написал

И я же прошу выложить ваш проект

...
См сюда:
http://zalil.ru/30651267 Там оставил exe скомпиленный, и добавил Edit, в который вводишь путь к программе и кликаешь кнопку.
У меня все работает...
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 13:41:27
KOL48
Maxizar писал(а):Так я его для вас и написал И я же прошу выложить ваш проект ...
Что-то я туплю.
Maxizar писал(а):Там оставил exe скомпиленный, и добавил Edit, в который вводишь путь к программе и кликаешь кнопку.
Хочется разобраться почему
у меня не запускается.
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 11.03.2011 13:49:04
Maxizar
Возможно сбросились настройки вот тут: Окружение->Параметры->Окружение: Прописать пути к исходникам, компилятору и т.п.

Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 12.03.2011 22:41:48
Сквозняк
Чего только люди не изобретут чтобы не писать строку с путями в кавычках
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 13.03.2011 00:54:18
Padre_Mortius
Код: Выделить всё
procedure runapp;
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.CommandLine := QuotedStr('C:\Program Files\Internet Explorer\iexplore.exe');
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 13.03.2011 10:30:31
Maxizar
Сквозняк писал(а):Чего только люди не изобретут чтобы не писать строку с путями в кавычках
А почему тогда у меня без кавычек и даже с рускими путями все заработало, у меня значит система невпорядке?
я в Edit вбивал следующее:
Код: Выделить всё
c:\wavGenerator_ver1.1\WaveGenerator.exe
C:\Program Files\Internet Explorer\iexplore.exe http://yandex.ru
C:\Program Files\Internet Explorer\iexplore.exe
c:\привет\WaveGenerator.exe'
и все работало. Осел yandex.ru открывал...

Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 13.03.2011 13:10:01
Padre_Mortius
Maxizar
Ваш пример вполне нормально будет работать на системах MS Windows Vista и выше, на MS Windows XP пробелы нужно обязательно экранировать двойными кавычками
Re: TProcess. Запустить программу с пробелами в пути.
Добавлено: 13.03.2011 13:32:52
Maxizar
Padre_Mortius писал(а):Maxizar
Ваш пример вполне нормально будет работать на системах MS Windows Vista и выше, на MS Windows XP пробелы нужно обязательно экранировать двойными кавычками
Спасибо, буду знать, но самое удивительно, что у меня как раз Windows XP. SP3.

.. но на всякий случай, нужно запомнить...