Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ShellExecute ? [D5, D7, Win2k, WinXP]


T2K ©   (2004-05-08 03:44:00) 

Народ, нужна помощь! Бьюсь уже n-ый день... Трабла вот в чем: я запускаю программу ( либо файл какой-либо) через ShellExecute. Например: ShellExecute(Form1.handle,nil,'cmd.exe',nil,nil,SW_ShowNormal);.Но! Мне нужно запустить некоторые проги с параметрами, т.е. по идее получаеца так (например): ShellExecute(Form1.handle,nil,'ping.exe','127.0.0.1',nil,SW_ShowNormal);, но при этом я не могу передать параметр так как нужно, могу только так: ShellExecute(Form1.handle,nil,'ping.exe 127.0.0.1',nil,nil,SW_ShowNormal);. (так как надо я не могу, так устроена моя программа).НО так не запускаеца программа с параметрами. Как мне сделать что бы она запустилась? WinExec или CreateProcess мне не нужно, т.к. они запускают тока программы, а не разные типы файлов.


KilkennyCat   (2004-05-10 04:54:00) [1]

прочитай эту ветку всю еще раз...


T2K   (2004-05-10 04:49:00) [2]

Лана народ, объясню последний раз с листингом.. поможете - огромное пасиба, непоможете, всеравно пасиба =)) :
...
Tray.OnClick := Form1.TrayStart;
...
procedure TForm1.TrayStart(Sender: TObject);
begin
if (Sender is TMenuItem) then
begin
ShellExecute(Form1.Handle, nil, PChar(StripHotKey((Sender as TMenuItem).Caption)), nil, nil, SW_ShowNormal);
end;
end;

Вызываеца процедура при нажатии на пункт в меню, заголовки которого типа C:\winnt\system32\cmd.exe, либо там C:\Winnt\system32\ping.exe 127.0.0.1, либо C:\1.jpg, etc. Смысл в том, что все великолепно работает, но если заголовок типа C:\Winnt\system32\ping.exe 127.0.0.1, то пинг не запускаеца (ну либо другое приложение с параметрами)


Dimaxx   (2004-05-09 21:42:00) [3]

Элементарно, Ватсон! Перед параметром поставь пробел!

ShellExecute(Form1.handle,nil,'ping.exe',' 127.0.0.1',nil,SW_ShowNormal);

и все тип-топ. Тоже сталкивался с такими граблями. Выход нашел совершенно случайно!


DeadMeat   (2004-05-09 17:32:00) [4]

Ну тады другое дело...


Anatoly Podgoretsky   (2004-05-09 17:20:00) [5]

DeadMeat ©   (09.05.04 17:01) [12]
А нам и так не плозо, это чисто его проблема.


DeadMeat   (2004-05-09 17:01:00) [6]

> T2K
Слушай... Хватит тут всем голову морочить... Напиши как в твой ShellExecute передаются твои параметры из обработчика... А ещё лучше весь обработчик...
Думаю после этого всем станет проще...


Mim1   (2004-05-09 06:48:00) [7]

Если надо отделить имя файла от параметров то воспользуйтесь следующей функцией (так же по ее анаогии можно написать функцию выделяющую параметры из командной строки)

Function FN(s:string):string;
var i,j:integer;
begin
 s := Trim(s);
 i := pos('"',s);
 j := pos(' ',s);
 if j = 0 then
   begin
     result := s;
     exit;
   end;
 if (i < j) and (i <> 0) then
   begin
     j := posex('"',s,i+1); // uses strutils
     Result := copy(s,i+1,j-i-1);
     exit;
   end
 else
   begin
     Result := copy(s,1,j-1);
     exit;
   end;
end;


T2K   (2004-05-09 06:21:00) [8]

у мя тоже великолепно так работает ShellExecute(Form1.handle,nil,'ping.exe','127.0.0.1',nil,SW_ShowNormal);
НО мне так ненада, моя прога так устроена что я немогу отделить параметры от самой программы (по замыслу). Потому и ломаю бошку


KilkennyCat   (2004-05-09 04:25:00) [9]


> T2K   (09.05.04 00:59) [8]
>
> > Т.е. у мя там нетолько exe, но и простые файлы, типа txt,
>
> > jpg, etc.
>
>
> вот в чем трабла


Разве это трабла?
во-первых, не так уж и много расширений для исполняемых файлов, так что отловить, что запустить шеллом, а что вином - не трабла.
во-вторых, у меня ShellExecute(Form1.handle,nil,'ping.exe','127.0.0.1',nil,SW_ShowNormal); прекрасно работает,
в-третьих, ShellExecute(Form1.handle,nil,'C:\Новая папка\Новая папка\ping.exe','127.0.0.1',nil,SW_ShowNormal); то же работает.
в-четвертых, если из строки 'C:\Новая папка\Новая папка\ping.exe 127.0.0.1' нужно вычленить нужное, то определяйте не по пробелу, а по первому вхождению точки + 3, если у названия файла предполагается несколько точек, то я думаю, клик мышки по менюшке и так дает его название...

???


T2K   (2004-05-09 00:59:00) [10]


> Т.е. у мя там нетолько exe, но и простые файлы, типа txt,
> jpg, etc.


вот в чем трабла


Anatoly Podgoretsky   (2004-05-08 16:57:00) [11]

Пути со специальными символами положено брать в кавычки еще с 1981 года


T2K   (2004-05-08 16:17:00) [12]

WinExec не помогает, т.к. у мя процедура сделана, на клик мыши в меню. При нажатии в процедуре написано типа выполнить то, что в заголовке меню. Т.е. у мя там нетолько exe, но и простые файлы, типа txt, jpg, etc. Но так же есть и программы с параметрами, то что предложил Adil не помогает, т.к. если путь к файлу с пробелами, то прога не запускаеца.


Anatoly Podgoretsky   (2004-05-08 11:35:00) [13]

Четвертый параметр - это командная строка для программы.


Adil   (2004-05-08 10:11:00) [14]

T2K прав. ShellExecute(Form1.handle,nil,'ping.exe 127.0.0.1',nil,nil,SW_ShowNormal);
Так не получается.
Есть такой метод. Тебе нужен
. ShellExecute(Form1.handle,nil, 'ping.exe','127.0.0.1',nil,SW_ShowNormal);

Значит так

Var
prog,param,vsyo:string;
i:string;
begin
vsyo:='ping.exe 127.0.0.1'

  for i:=1 to length(vsyo)-1 begin
         prog:=prog+vsyo[i];
      if vsyo[i+1]=' ' then
         break;
  end;
param:=vsyo;
delete(param,1,length(prog)+1);

ShellExecute(Form1.handle,nil,pchar(prog),pchar(param),nil,SW_ShowNormal);

end;


Может быть есть ошыбки. Но логично так. Если будет проблемы пиши на мейл: adil@aliev.info
ICQ: 17321977
YM: alievadil
MSN: adil@aliev.info


DarkMan   (2004-05-08 09:54:00) [15]

ShellExecute(0,'open',PChar(strProgramPath),PChar(strProgramParam),PChar(FFilePath),SW_HIDE);


DVM   (2004-05-08 09:22:00) [16]

WinExec('cmd /c ping.exe <параметры>', sw_show);

>но при этом я не могу передать параметр так как нужно
Это почему? Все нормально передается.


Maxim2030   (2004-05-08 08:51:00) [17]

попробуй

WinExec('cmd /c ping.exe <параметры>')


Наверх

Титульная страница Поиск, карта сайта Написать письмо