Как открыть файл delphi shellexecute

Обновлено: 02.07.2024

После того, как приложение размещает файловый объект, для него часто приходится выполнять следующие действия. Например, приложению может потребоваться запустить другое приложение, позволяющее пользователю изменять файл данных. Если файл является исполняемым файлом, приложение может захотеть просто запустить его. В этом документе описывается, как использовать ShellExecute или ShellExecuteEx для выполнения этих задач.

Использование ShellExecute и ShellExecuteEx

Чтобы использовать ShellExecute или ShellExecuteEx, приложение должно указать объект файла или папки, к которому будет применена операция, и команду , указывающую операцию. Для ShellExecute присвойте эти значения соответствующим параметрам. Для ShellExecuteEx заполните соответствующие элементы структуры шеллексекутеинфо . Существует также несколько других элементов или параметров, которые можно использовать для точной настройки поведения двух функций.

Объекты файлов и папок могут быть частью файловой системы или виртуальных объектов, и их можно идентифицировать по путям или указателям на списки идентификаторов элементов (PIDL).

Команды объекта

Команды, доступные для объекта, по сути являются элементами, которые находятся в контекстном меню объекта. Чтобы узнать, какие команды доступны, просмотрите реестр в разделе

HKey _ _Корень классов \ CLSID \ \ \ команда оболочки

где _ CLSID объекта — это идентификатор класса (CLSID) объекта, а глагол — имя доступной команды. Подключ \ команды verb содержит данные, указывающие, что происходит при вызове этой команды.

Чтобы узнать, какие команды доступны для предопределенных объектов оболочки, просмотрите раздел реестра в разделе

HKey _ Классы _ корневого \ объекта _ имя класса \ \ команда оболочки

где _ имя объекта — это имя предопределенного объекта оболочки. Опять же, \ подраздел команды verb содержит данные, указывающие, что происходит при вызове этой команды.

Часто доступные команды включают:

Команда Описание
изменение; Запускает редактор и открывает документ для редактирования.
поиск Инициирует поиск, начиная с указанного каталога.
open Запускает приложение. Если этот файл не является исполняемым файлом, запускается связанное с ним приложение.
print Выводит файл документа.
properties Отображает свойства объекта.
запуск от имени Запускает приложение от имени администратора. Функция контроля учетных записей (UAC) запросит у пользователя разрешение на запуск приложения с повышенными правами или введите учетные данные администратора, используемого для запуска приложения.

Каждая команда соответствует команде, которая будет использоваться для запуска приложения из окна консоли. Хорошим примером является команда Open , так как она обычно поддерживается. Для файлов .exe Open просто запускает приложение. Однако чаще используется для запуска приложения, которое работает с определенным файлом. Например, файлы .txt могут быть открыты Microsoft WordPad. Команда Open для файла .txt, таким образом, будет соответствовать примерно следующей команде:

При использовании ShellExecute или ShellExecuteEx для открытия файла .txt Wordpad.exe запускается с указанным файлом в качестве аргумента. Некоторые команды могут иметь дополнительные аргументы, например флаги, которые можно добавить при необходимости для правильного запуска приложения. Дальнейшее обсуждение контекстных меню и глаголов см. в разделе расширение контекстных меню.

Как правило, попытка определить список доступных команд для определенного файла немного сложна. Во многих случаях можно просто установить для параметра Лпверб значение NULL, которое вызывает команду по умолчанию для типа файла. Эта процедура обычно эквивалентна установке лпверб в значение "Open", но некоторые типы файлов могут иметь разные команды по умолчанию. Дополнительные сведения см. в разделе расширение контекстных меню и справочная документация по ShellExecuteEx .

Использование ShellExecuteEx для предоставления служб активации с сайта

Службы цепочки сайтов могут управлять множеством поведений активации элементов. на Windows 8 можно указать указатель на цепочку сайтов, чтобы ShellExecuteEx для включения этих поведений. Чтобы предоставить сайт ShellExecuteEx:

  • Укажите параметр см _ _ . флаг маски _ хинст _ — _ флаг сайта в элементе фмаск элемента шеллексекутеинфо.
  • Укажите IUnknown в члене хинстапп объекта шеллексекутеинфо.

Использование ShellExecute для запуска диалогового окна поиска

когда пользователь щелкает правой кнопкой мыши значок папки в обозревателе Windows, одним из пунктов меню является «Search» (поиск). При выборе этого элемента оболочка запускает свою служебную программу поиска. Эта программа отображает диалоговое окно, которое можно использовать для поиска в файлах указанной текстовой строки. Приложение может программно запустить программу поиска для каталога путем вызова ShellExecuteс параметром "Find" в качестве параметра лпверб , а путь к каталогу — как параметр лпфиле . Например, следующая строка кода запускает программу поиска для каталога c: \ мипрограмс.

Простой пример использования ShellExecuteEx

В следующем примере консольного приложения показано использование ShellExecuteEx. Для ясности опущена большая часть кода проверки ошибок.

приложение сначала извлекает пидл каталога Windows и перечисляет его содержимое до тех пор, пока не найдет первый файл .bmp. В отличие от предыдущего примера, ишеллфолдер:: жетдисплайнамеоф используется для получения имени синтаксического анализа файла вместо его отображаемого имени. Так как это папка файловой системы, имя синтаксического анализа — это полный путь, который необходим для ShellExecuteEx.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Исполняется программный поток. Поток - это последовательность машинных команд, которые 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 Указанный путь не найден.

Еще один простой вызов это - ShellExecute. Этот вызов во многом напоминает WinExec,

Например, если вы с помощью ShellExecute вы попробуете запустить файл с расширением .BMP,

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

строку, такую как 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.

if ShellExecute(h, 'open' , 'readme.txt' , nil , nil , SW_SHOW) < 32 then

ShowMessage( 'Немогу выполнить ShellExecute !' )

if WinExec( 'Notepad c:\config.sys' , SW_SHOW) < 32 then

ShowMessage( 'Немогу выполнить WinExec !' )

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

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

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

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

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

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

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

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

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

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

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

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

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

3. Каталог Windows.

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

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

Функция ShellExecute

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

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

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

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

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

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

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

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

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

уже 2 дня мучаюсь, помогите, кто знает.

заранее огромное спасибо!!

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Как пользоваться функцией экспорта в DBChart?
В DBChart заметил функцию для экспорта . Как ей пользоваться?

Timer в Delphi и как им пользоваться.
Я решил сделать прикол, а нужно вставить таймер, и чтобы он отсчитывал время. Помогите и объясните.


Как проанализировать значение возвращаемое функцией ShellExecute?
Всем здравствуйте. Инструкция int res = ShellExecute(0, L&quot;open&quot;, path.c_str(), NULL, 0.

Решение

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

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

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

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

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

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

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

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

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

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

Читайте также: