delphi winexec с параметрами

Процессы, потоки и функции ShellExecute и WinExec

Процессы, потоки и функции ShellExecute и WinExec

Содержание материала

SW_HIDE Окно в скрытом режиме.

SW_MAXIMIZE Окно максимального размера

SW_MINIMIZE Окно находится в свернутом виде, активируется следующее верхнее окно в Z последовательности.

SW_RESTORE Активирует и показывает окно. Если окно свернуто или развернуто, Windows восстанавливает его

к первоначальному размеру и позиции. Приложение должно определить этот флаг при восстановлении свернутого окна.

SW_SHOW Активирует окно и выводит его в текущих размерах и позиции.

SW_SHOWMAXIMIZED Активирует и показывает окно в развернутом виде.

SW_SHOWMINIMIZED Активирует и показывает окно в свернутом виде.

SW_SHOWMINNOACTIVE Отображает окно в свернутом виде. Активное окно остается активным.

SW_SHOWNA Отображает окно в текущем состоянии. Активное окно остается активным.

SW_SHOWNORMAL Активирует и показывает окно. Если окно свернуто или развернуто,

Windows восстанавливает его к первоначальному размеру и позиции.

Приложение должно определить этот флаг при показе окна в первый раз.

Значение, которое возвращает ShellExecute такое же, как и у WinExec. Функцию ShellExecute можно использовать,

например, для открытия корневого каталога диска С:

ShellExecute(hWnd, ‘open’, ‘c:\’, nil, nil, SW_SHOWNORMAL);

Вы можете заменить строку «open» на «explore» и в качестве третьего параметра указать любой каталог,

в этом случае указанная вами папка откроется в Проводнике (Explorer).

Так же существует системный вызов ShellExecuteEx, который фактически является полным аналогом

ShellExecute, однако в качестве аргумента он принимает указатель на структуру, поля которой во многом

совпадают с аргументами ShellExecute. Кроме этого после завершения своей работы ShellExecuteEx помещает

в одно из полей этой структуры дескриптор запущенной программы.

Применение этих вызовов довольно просто. Пример программы использующей WinExec и ShellExecute

приведен в листинге 1.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!

Источник

Delphi winexec с параметрами

В этом небольшом уроке мы рассмотрим работу с командной строкой в Delphi.

Непосредственно передачу команд в командую строку операционной системы Windows в Delphi помогает реализовать процедура WinExec. Вообще, WinExec позволяет обращаться к любым исполняемым файлам с возможностью передачи им каких-либо параметров. В качестве самого примитивного примера использования этой процедуры можно привести запуск калькулятора Windows:
[cc lang=»delphi»]WinExec(PAnsiChar(‘calc.exe’), SW_SHOWNORMAL);[/cc]
Рассмотрим параметры, которые необходимо передавать WinExec:

Теперь научимся обращаться к командной строке, используя процедуру WinExec. Рассмотрим несложный пример:
[cc lang=»delphi»]WinExec(PAnsiChar(‘cmd /c md f:\t’), SW_HIDE);[/cc]
Как вы видите, мы указали SW_HIDE, чтобы не отображать окно консоли. Обратим внимание на формирование самой команды.

procedure TForm2.Button1Click(Sender: TObject);
begin
CompileDelphiCode(‘f:\t.dpr’);
end;[/cc]
Этой процедуре необходимо передать единственный параметр — абсолютный или относительный путь до исходного dpr файла. В результате будет запущен компилятор Delphi «dcc32», который скомпилирует исходный код в папку с указанным dpr файлом. Если у вас возникли проблемы с тем, что командная строка не знает, что такое dcc32, то укажите вместо dcc32 абсолютный путь до самого компилятора, который лежит в папке с вашей средой Delphi в папке bin и называется «dcc32.exe».
delphi winexec с параметрами

Источник

Уроки Delphi

понедельник, 28 июля 2008 г.

Запуск других приложений

Существует две наиболее часто применяемых функций. WinExec и ShellExecute

WinExec, оставлена для совместимости с ранними версиями Windows, но я рекомендую для обычного запуска программы с командной строкой использовать эту. У нее мало параметров запуска.

Используемый модуль – Windows.

Описание: WinExec (FileName: PChar; CmdShow: Cardinal) : Cardinal;

где: FileName – путь, имя запускаемого приложения, параметры командной строки. Все указывается в одной строке;

CmdShow – стиль окна. Показывает, в каком состоянии будет отображаться окно при запуске.

Параметры отображения окна CmdShow:

SW_HIDEЗапускаемое приложение делается невидимым
SW_MAXIMIZEРасширяет окно на весь экран
SW_MINIMIZEЗапускаемое приложение минимизируется. После запуска активизируется окно высшего уровня, т.е. окно, откуда было запущено это приложение
SW_RESTOREДелает окно таким, каким оно было запущено в последний раз
SW_SHOWОтображает окно в своем текущем размере и позиции

Для не-Windows приложений определяет состояние окна файл PIF, если таковой имеется в наличии. Если необходимо закрывать окно после завершения работы такого приложения необходимо создать PIF ярлык к нему в том же каталоге с таким же названием и поставить галочку «Закрывать окно по завершению сеанса работы». Все дополнительные параметры запуска устанавливаются там же.

Возвращаемые значения функции WinExec:

31нормальный запуск
0системе не хватает памяти или ресурсов
ERROR_BAD_FORMATEXE файл поврежден или имеет неверный формат (Windows на такой файл говорит, что он не является приложением Win32)
ERROR_FILE_NOT_FOUNDфайл не найден
ERROR_PATH_NOT_FOUNDпуть к файлу задан неверно

Если имя выполняемого файла в параметре FileName не содержит пути директории, Windows производит поиск выполняемого файла в такой последовательности:

1. Каталог из которого приложение было запущено. Это рабочий каталог

2. Системный каталог Windows (обычно C:\WINDOWS\SYSTEM).

4. Директории, указанные в переменной операционной среды в среде PATH. Узнать о каталогах этой переменной можно, введя PATH в командной строке сеанса MS-DOS.

Пример использования функции WinExec в программе:

WinExec (‘command.com’, SW_SHOW); // запускает сеанс MS-DOS

Функция ShellExecute не только запускает программы, а открывает, редактирует или печатает файл, с учетом зарегестрированного типа, а также открывает указанную папку проводником. Возвращает Handle ссылку на открытое окно.

Используемый модуль ShellAPI. Его нужно не забыть указать в разделе Uses.

Описание: ShellExecute (hWnd: HWND; Operation: PChar; FileName: PChar; Parametrs: PChar; Directory: PChar; CmdShow: Integer): HINST;

где: hWnd – Handle родительского окна, в который будут передаваться сообщения запускаемого приложения. Можно указывать Handle-ссылку окна вашего приложения.

Operation – производимая операция. Open – открыть, print – напечатать, explore – открыть папку. По умолчанию open, если указать nil.

FileName – имя файла или документа, интернет ссылка, e-mail адрес.

Parametrs – параметры, передаваемые приложению в командной строке.

Directory – каталог по умолчанию.

CmdShow – стиль окна. Показывает, в каком состоянии будет отображаться окно при запуске. Подробно рассказано выше.

Вместо параметров Operation, Parametrs и Directory можно ставить nil. Они являются не обязательными параметрами для запуска.

В случае успешного запуска возвращает Handle окна, в случае неудачи возвращает код ошибки меньше или равное 32. Список возможных ошибок можно прочитать в справке по этой команде.

Пример использования команды ShellExecute в программе:

ShellExecute (Form1.Handle, nil, ‘http://programming.dax.ru’, nil, nil, SW_RESTORE); //запуск нашей странички

ShellExecute (Form1.Handle, nil, PChar (Application.ExeName), nil, nil, SW_RESTORE); //запуск второй копии этой программы

ShellExecute (Form1.Handle, nil, ‘iexplore’, ‘http://programming.dax.ru’, nil, SW_RESTORE); //запуск в отдельном окне

ShellExecute (Form1.Handle, nil, ‘mailto:semen@krovatka.net?subject=delphi’, nil, nil, SW_RESTORE); //написать мне письмо

ShellExecute (Form1.Handle, nil, ‘c:\1.doc’, nil, nil, SW_RESTORE); //открыть документ

Источник

Процессы, потоки и функции ShellExecute и WinExec

Процессы, потоки и функции ShellExecute и WinExec

Содержание материала

Устройство Windows. Процессы, потоки и функции ShellExecute и WinExec. Часть 1.

По просьбам общественности и была написана эта статья.

Действительно невозможно профессионально разрабатывать многопоточные программы,

не зная, что такое процессы, потоки, нити и синхронизация (надеюсь посвятить этому одну из следующих статей) и,

не представляя, как они работают. В статье за основу взята операционная система Windows 2000.

Так же в этой статье будут подробно рассмотрены различные методы запуска новых процессов (программ).

Главным обстоятельством является то, что почти все современные ОС многозадачны.

ОС Windows 2000 не является исключением, в ней может работать одновременно несколько программ.

Любая программы имеет, по крайней мере, одним программным потоком,

который в свою очередь может создавать еще несколько потоков и т.д.

Но, не смотря на то, что ОС, называется «многозадачной» в конкретный момент времени

выполняется только один поток. что вы не замечаете, как ОС переключается между потоками.

Не стоит забывать, что, распределяя процессорное время, операционная система Windows,

имеет дело именно с потоками, а не с процессами, которым эти потоки принадлежат.

Запуская программу в Windows, вы создаете процесс.

И в этом нет ничего удивительного, потому что в других операционных системах происходит почти то же самое.

Однако все же процесс в Windows, например, отличается от процесса в Unix.

А все дело в том, что в Windows процесс владеет открытыми файлами, оперативной памятью и другими ресурсами.

Для каждого процесса (программы) Windows выделяет виртуальное адресное пространство объемом 2 Гб.

Для адресации этого пространства используются обычные 32-битные указатели,

которые представляют собой числа от 0 до 2 Г. Но процесс в Windows не исполняется.

воспринимает, как единое целое (набор регистров процессора).

Поток обладает указателем на команду, которая в данный момент выполняется,

и указателем на стек где хранятся локальные переменные потока.

Так в чем же разница спросите вы, между процессом и потоком, если запущенная программа имеет только один,

программный поток то разницы практически никакой. Однако поток может создавать другие потоки.

А те потоки могут создавать еще потоки. Два процесса ни могут иметь общие ресурсы,

если не используют специальные механизмы межпроцессорного взаимодействия.

В противоположность этому все потоки, которые принадлежат одному процессу,

имею доступ ко всем ресурсам этого процесса.

Зачем процессу несколько потоков? Потоки могут выполнять какие-то действия параллельно

основной программе (в фоновом режиме). Потоки удобно применять, если нежелательна

блокировка основной программы определенной функцией. Например, в то время, как поток

осуществляет сложные математические вычисления, в главной программе происходит подготовка

следующего задания и ввод параметров.

Если вам нужно запустить новую программу, вам нужно создать новый процесс.

Для этой цели служит системный вызов CreateProcess.

Однако использование этого вызова не очень удобно, потому что приходится задавать множество аргументов,

однако в некоторых случаях без него не обойтись.

Если же вам надо просто запустить программу или открыть файл,

то для этого подходят мене сложные вызовы.

Легче всего использовать WinExec. Однако Microsoft не рекомендует его использование,

а предлагает пользоваться CreateProcess.

Но для выполнения тех или иных задач он вполне подходит.

Почему же нежелателен вызов WinExec дело все в том, что фактически он содержит обращение

к еще одному устаревшему системному вызову LoadModule, который обращается к CreateProcess

со значениями аргументов по умолчанию. При обращении к WinExec необходимо задать полный путь

к программе или имя EXE файла, расположенного в пути поиска, а также способ

отображения программы (константы SW_HIDE, SW_SHOW и т.д. см. Таблица 2).

Если вызов функции произошел успешно, то WinExec вернет дескриптор новой

программы (который не может быть меньше 32, т.е. если WinExec возвращает число меньше 32,

то вызов привел к ошибке, коды ошибок см. Таблица 1).

0 Системе не хватает ресурсов.

ERROR_BAD_FORMAT Некорректный EXE файл (не Win32 EXE файл или EXE файл поврежден).

ERROR_FILE_NOT_FOUND Указанный файл не найден.

ERROR_PATH_NOT_FOUND Указанный путь не найден.

однако он поддерживает обработку типов файлов, зарегистрированных в Windows.

то буде запущена программа Paint или любая другая, которая использует для просмотра графических файлов.

В качестве аргументов ShellExecute принимает дескриптор окна (если есть необходимость в сообщениях об ошибках),

строку, такую как open (открыть), print (напечатать) и explore (исследовать), можно в качестве этой строки передать NULL,

тогда файл указанный вами будет открыт (open). Так же ShellExecute необходимо сообщить имя файла и любые параметры

командной строки (чаще всего NULL), и оставшиеся два аргумента это текущий каталог и константа функции

ShowWindow (как и в WinExec см. Таблица 2).

SW_HIDE Окно в скрытом режиме.

SW_MAXIMIZE Окно максимального размера

SW_MINIMIZE Окно находится в свернутом виде, активируется следующее верхнее окно в Z последовательности.

SW_RESTORE Активирует и показывает окно. Если окно свернуто или развернуто, Windows восстанавливает его

к первоначальному размеру и позиции. Приложение должно определить этот флаг при восстановлении свернутого окна.

SW_SHOW Активирует окно и выводит его в текущих размерах и позиции.

SW_SHOWMAXIMIZED Активирует и показывает окно в развернутом виде.

SW_SHOWMINIMIZED Активирует и показывает окно в свернутом виде.

SW_SHOWMINNOACTIVE Отображает окно в свернутом виде. Активное окно остается активным.

SW_SHOWNA Отображает окно в текущем состоянии. Активное окно остается активным.

SW_SHOWNORMAL Активирует и показывает окно. Если окно свернуто или развернуто,

Windows восстанавливает его к первоначальному размеру и позиции.

Приложение должно определить этот флаг при показе окна в первый раз.

Значение, которое возвращает ShellExecute такое же, как и у WinExec. Функцию ShellExecute можно использовать,

например, для открытия корневого каталога диска С:

ShellExecute(hWnd, ‘open’, ‘c:\’, nil, nil, SW_SHOWNORMAL);

Вы можете заменить строку «open» на «explore» и в качестве третьего параметра указать любой каталог,

в этом случае указанная вами папка откроется в Проводнике (Explorer).

Так же существует системный вызов ShellExecuteEx, который фактически является полным аналогом

ShellExecute, однако в качестве аргумента он принимает указатель на структуру, поля которой во многом

совпадают с аргументами ShellExecute. Кроме этого после завершения своей работы ShellExecuteEx помещает

в одно из полей этой структуры дескриптор запущенной программы.

Применение этих вызовов довольно просто. Пример программы использующей WinExec и ShellExecute

приведен в листинге 1.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!

Источник

. when altering one’s mind becomes as easy as programming a computer, what does it mean to be human.

5 января 2015 г.

Почему вам (никогда) не следует использовать ShellExecute и WinExec

Суть проблемы

Посмотрите на такой кусок кода:
Вопрос: что будет, если при открытии файла возникнет ошибка? Скажем, файла такого нет или он эксклюзивно открыт другой программой.

delphi winexec с параметрами

P.S. А в общем случае это может быть какой-то ваш код для обработки ошибок. Или, к примеру, если вы используете трейсер исключений, то он создаст вам отчёт о этой проблеме и отправит его вам на почту.

Вроде всё хорошо и красиво, да?

Ответ: а ничего не будет. Ваш код этого не заметит и продолжит тихо выполняться дальше, считая, что операция прошла успешно. И тогда программист побежит на форумы, спрашивая «почему не работает код».

Обработка ошибок в коде Delphi и коде Windows

Почему так происходит?

Как я это определил?

Дело в том, что код Delphi для сообщения об ошибках использует механизм исключений, а код Windows использует механизм кодов ошибок.

P.S. Когда на форуме кто-то задаёт вопрос «почему не работает код», в 90% случаев причина вопроса в том, что программист не расставил правильную обработку ошибок. Чаще всего он вызывает функции Windows, не удосуживаясь проверять коды ошибок.

Обработка ошибок вызовов ShellExecute и WinExec

Return value
Type: HINSTANCE
If the function succeeds, it returns a value greater than 32. If the function fails, it returns an error value that indicates the cause of the failure. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. It can be cast only to an int and compared to either 32 or the following error codes below.

Функции ShellExecute и WinExec используют семантику единого адресного пространства для всех программ. Как мы знаем, в современных 32-битных (и выше) Windows (т.е. Windows 95 и старше) каждый процесс получает свой экземпляр «памяти» (адресного пространства), который изолирован и никак не связан с другими программами. Это было не так в 16-битных Windows: в ней все программы запускались в одной «памяти» (в едином адресном пространстве).

И раз функции ShellExecute и WinExec возвращают экземпляр загруженного модуля ( HINSTANCE ) как идентификатор запущенной программы, то они созданы для Windows 3.11 (и более ранних ОС) и крайне плохо приспособлены для Windows 95 (и более новых систем).

Правильное решение

Обработка ошибок вызовов ShellExecuteEx и CreateProcess

Return value
Type: BOOL
Returns TRUE if successful; otherwise, FALSE. Call GetLastError for extended error information.

delphi winexec с параметрами

Простые обёртки к ShellExecuteEx и CreateProcess

Пример исправления кода

Фух, теперь мы, наконец-то, можем исправить код «плохих» примеров!

Для этого я сделал поиск по «ShellExecute Delphi» (без кавычек, конечно же) и взял несколько примеров:
Как мы можем исправить этот код?

Итого:
Этот код теперь «волшебным» образом стал правильным и корректным.

P.S. Если вы используете ShellExecuteEx с действием » runas » для запуска процесса с элевацией, то вам нужно передавать корректный описатель окна ( HWND ): он будет использоваться для идентификации вашего процесса как приложения первого плана. Если же вы его не укажете, то ваше приложение будет считаться фоновым приложением. В этом случае запрос UAC на повышение прав не будет показан на экране сразу, а появится в свёрнутом (и мигающем) виде на панели задач.

Итого, при желании код может быть упрощён до:

Прочие проблемы

delphi winexec с параметрами

Заключение

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *