Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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);

Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Время отправки: 22 июня 2006, 11:53
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Виталий Лещенко

Тебе нужно именно с помошью ShellExecute?
imho это не самый лучший способ запуска программ, хотя бы потому, что эта функция предназначена немного для другого...
Вот пример как реализовать нужную тебе функциональность, но с помощью CreateProcess.

Приложение:
  1. unit UnitCompiler;
  2.  
  3. interface
  4.  
  5. uses SysUtils,Windows,Messages;
  6.  
  7. var
  8. ProcessInfo: TProcessInformation;
  9.  
  10. function Execute(const exe: string; const args: array of const; wait: Boolean = true): DWORD;
  11.  
  12. implementation
  13.  
  14. function Execute(const exe: string; const args: array of const; wait: Boolean = true): DWORD;
  15. var
  16. cmd: string;
  17. i: Integer;
  18. ExitCode: DWORD;
  19. StartupInfo:TStartupInfo;
  20. begin
  21. ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
  22. StartupInfo.cb := SizeOf(StartupInfo);
  23. StartupInfo.wShowWindow := SW_HIDE;
  24. StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  25. cmd := exe;
  26. for i := 0 to High(args) do
  27. begin
  28. with args[i] do
  29. case VType of
  30. vtChar: cmd := cmd + ' ' + VChar + #0;
  31. vtString: cmd := cmd + ' ' + VString^ + #0;
  32. vtPChar: cmd := cmd + ' ' + VPChar + #0;
  33. vtAnsiString: cmd := cmd + ' ' + string(VAnsiString) + #0;
  34. vtInteger: cmd := cmd + ' ' + IntToStr(VInteger) + #0;
  35. end;
  36. SetLength(cmd, StrLen(@cmd[1]));
  37. end;
  38. if CreateProcess(nil, pchar(cmd), nil, nil, false,
  39. CREATE_SEPARATE_WOW_VDM, nil, nil, StartupInfo,
  40. ProcessInfo) then
  41. if wait then
  42. begin
  43. WaitForSingleObject(ProcessInfo.hProcess, DWORD(-1));
  44. GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
  45. Result := ExitCode;
  46. end
  47. else
  48. Result := 0
  49. else
  50. Result := GetLastError();
  51. CloseHandle(ProcessInfo.hThread);
  52. if wait then
  53. CloseHandle(ProcessInfo.hProcess);
  54. end;
  55.  
  56. end.
  57.  


Ответ отправил: Виталий Лещенко (статус: 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';

Ответ отправила: Щекочихина Татьяна Николаевна (статус: 1-ый класс)
Время отправки: 23 июня 2006, 07:35
Оценка за ответ: 5

Ответ #4. Отвечает эксперт: min@y™

Вот пример запуска Internet Explorer с заданным URL'ом:

Приложение:
  1. procedure TMainForm.OpenURL(const AURL: string);
  2. begin
  3. ShellExecute(Handle,
  4. 'open',
  5. 'iexplore.exe',
  6. PChar(AURL),
  7. nil,
  8. SW_ShowNormal);
  9. end;


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 23 июня 2006, 08:20
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 24 июня 2006, 23:51; участников в обсуждении: 3.
Dron

Dron (статус: Студент), 22 июня 2006, 12:13 [#1]:

Последним параметром лучше указывать SW_SHOWNORMAL, т.е. обычное состояние, а не развёрнутое.
С уважением.
Виталий Лещенко

Виталий Лещенко (статус: 4-ый класс), 22 июня 2006, 17:04 [#2]:

Недостатком ShellExecute является то, что можно кое чего поправить в реестре и программы запускаться не будут... (Вирус Neshta этим пользуется...)
Dron

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

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)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.03 сек.