![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 <параметры>')