|
Вопрос # 55/ вопрос решён / |
|
Люди! Скажите как програмно запустить другую программу и передать ей какие-либо параметры (с помощью ShellExecute) причём параметры заключенв в переменную perem : string (Delphi 2005)?
 |
Вопрос задал: Жучков С. (статус: Посетитель)
Вопрос отправлен: 22 июня 2006, 11:28
Состояние вопроса: решён, ответов: 4.
|
Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович
prg:='c:\otherprog.exe';
params:='/param1 /param2';
ShellExecute(Form1.Handle,"open" ,PChar(prg), PChar(params),nil,SW_SHOWMAXIMIZED);
Ответ #2. Отвечает эксперт: Виталий Лещенко
Тебе нужно именно с помошью ShellExecute?
imho это не самый лучший способ запуска программ, хотя бы потому, что эта функция предназначена немного для другого...
Вот пример как реализовать нужную тебе функциональность, но с помощью CreateProcess.
Приложение: Переключить в обычный режим- unit UnitCompiler;
-
- interface
-
- uses SysUtils,Windows,Messages;
-
- var
- ProcessInfo: TProcessInformation;
-
- function Execute(const exe: string; const args: array of const; wait: Boolean = true): DWORD;
-
- implementation
-
- function Execute(const exe: string; const args: array of const; wait: Boolean = true): DWORD;
- var
- cmd: string;
- i: Integer;
- ExitCode: DWORD;
- StartupInfo:TStartupInfo;
- begin
- ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
- StartupInfo.cb := SizeOf(StartupInfo);
- StartupInfo.wShowWindow := SW_HIDE;
- StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
- cmd := exe;
- for i := 0 to High(args) do
- begin
- with args[i] do
- case VType of
- vtChar: cmd := cmd + ' ' + VChar + #0;
- vtString: cmd := cmd + ' ' + VString^ + #0;
- vtPChar: cmd := cmd + ' ' + VPChar + #0;
- vtAnsiString: cmd := cmd + ' ' + string(VAnsiString) + #0;
- vtInteger: cmd := cmd + ' ' + IntToStr(VInteger) + #0;
- end;
- SetLength(cmd, StrLen(@cmd[1]));
- end;
- if CreateProcess(nil, pchar(cmd), nil, nil, false,
- CREATE_SEPARATE_WOW_VDM, nil, nil, StartupInfo,
- ProcessInfo) then
- if wait then
- begin
- WaitForSingleObject(ProcessInfo.hProcess, DWORD(-1));
- GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
- Result := ExitCode;
- end
- else
- Result := 0
- else
- Result := GetLastError();
- CloseHandle(ProcessInfo.hThread);
- if wait then
- CloseHandle(ProcessInfo.hProcess);
- end;
-
- end.
-
 |
Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 22 июня 2006, 17:01
Оценка за ответ: 5
Комментарий к оценке: Ещё бы пояснения в коде...
|
Ответ #3. Отвечает эксперт: Щекочихина Татьяна Николаевна
ShellExecute(0, 'open', PChar(perem1),PChar(perem2), nil, SW_SHOW);
где perem1 - сама программа(ее имя),
а perem2 - парамтры к этой программе.
Если параметров нет, то вместо PChar(perem2) надо поставить nil.
Например: perem2:='-b -role admim -user sysdba -password zz GRS.GDB d:\work\arch\grs01.gbk';
perem1:='d:\util\gbak.exe';
Ответ #4. Отвечает эксперт: min@y™
Вот пример запуска Internet Explorer с заданным URL'ом:
Приложение: Переключить в обычный режим- procedure TMainForm.OpenURL(const AURL: string);
- begin
- ShellExecute(Handle,
- 'open',
- 'iexplore.exe',
- PChar(AURL),
- nil,
- SW_ShowNormal);
- end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 23 июня 2006, 08:20
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 24 июня 2006, 23:51; участников в обсуждении: 3.
|
Dron (статус: Студент), 22 июня 2006, 12:13 [#1]:
Последним параметром лучше указывать SW_SHOWNORMAL, т.е. обычное состояние, а не развёрнутое.
С уважением.
|
|
Виталий Лещенко (статус: 4-ый класс), 22 июня 2006, 17:04 [#2]:
Недостатком ShellExecute является то, что можно кое чего поправить в реестре и программы запускаться не будут... (Вирус Neshta этим пользуется...)
|
|
Dron (статус: Студент), 22 июня 2006, 17:31 [#3]:
Хм... Очень интересно узнать, что именно происходит? Первый раз об этом слышу.
С уважением.
|
|
Виталий Лещенко (статус: 4-ый класс), 22 июня 2006, 23:29 [#4]:
Вирус модифицирует ветку реестра
HKEY_CLASSES_ROOT\exefile\shell\open\command
Пишет там: c:\windows\svchost.com "%1" %*
Антивирус удаляет svchost.com и после этого при запуске любой программы через shell этот самый shell не знает чем открывать программы типа *.exe
|
|
Dron (статус: Студент), 23 июня 2006, 07:40 [#5]:
Ничего себе... Ну и дела... А как WinExec и CreateProcess ведут себя? Они от этого параметра не зависят?
С уважением.
|
|
Виталий Лещенко (статус: 4-ый класс), 24 июня 2006, 01:46 [#6]:
Видимо нет. Т.к. Word по ассоциации на *.doc успешно запускался... в общем можеш сам проверить... модифицировать эту ветку и наблюдать.
|
|
Жучков С. (статус: Посетитель), 24 июня 2006, 16:55 [#7]:
TStartupInfo - что это за тип?
|
|
Виталий Лещенко (статус: 4-ый класс), 24 июня 2006, 23:51 [#8]:
TStartupInfo это стандартный тип. Описан в Windows.pas
|
31 января 2011, 19:17: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|