Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Функция API ShellExecute - описание и применение  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5226
Так, для общего сведения

Функция ShellExecute запускает программу по имени или по ассоциации с файлом документа.

Объявление
для VBA 6
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
      (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
      ByVal lpParameters As String, ByVal lpDirectory as String, _
      ByVal nShowCmd As Long) As Long

Для VBA 7
Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
      (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _
      ByVal lpParameters As String, ByVal lpDirectory As String, _
      ByVal nShowCmd As Long) As LongPtr 


Примечание. VBA 7 при компиляции сам присваивает нужный тип переменным LongPtr - Long для 32-х битных версий офиса и LongLong для 64-х битных.

Описание.
Функция находит имя программы, связанной с заданным файлом, и либо запускает программу с загрузкой данного файла, либо выводит файл на печать. Типы файлов обычно связывается с конкретными приложениями в реестре Windows. Например, текстовые файлы с расширением .TXT обычно ассоциируются с приложением Windows Notepad (NOTEPAD.EXE). Если передать этой функции любой файл с расширением .TXT, функция либо запускает программу Notepad, указывая имя файла в качестве параметра, либо выводит файл на печать.

Параметры.
hwnd - Long/LongLong - манипулятор окна (хендл). Идентификатор родительского окна. Указывать родительское окно не обязательно, можно просто 0
lpOperationString - операция, выполняемая с файлом. Может иметь следующие значения: «open», «print», «explore», «find», «edit».

Если lpOperation="find", функция выводит диалоговое окно для поиска файлов по условиям. Параметр lpFile должен указывать путь к папке, начиная с которой будет выполняться поиск. Остальные параметры не используются.

Если lpOperation="explore", функция выводит диалоговое окно - список папок. Параметр lpFile должен указывать путь к папке, содержимое которой нужно посмотреть. Остальные параметры не используются.

Если lpOperation="edit", функция открывает файл на редактирование, загружая приложение, ассоциированное с расширением файла. Параметр Edit должен содержать имя файла, параметр plDirectory - указывать путь к этому файлу; если параметр lpDirectory не используется, то параметр lpFile должен указывать путь и имя файла.

Если lpOperation="open", функция выполняет следующие действия: если в lpFile указан исполняемый файл (например, типа EXE), то он запускается на выполнение; загружаемой программе передаётся список параметров, указанных в lpParameters; в противном файл открывается на редактирование.

Если lpOperation="print", то выполняется печать файла на принтере (фактически загружается ассоциированное с расширением файла приложение, которое и печатает документ).

По умолчанию - "open", если указано Null (vbNullString) или значение опущено.

lpFileString – файл или папка, которую нужно открыть
lpParametersString – параметры открытия файла, т.ч. запуска приложения. Используется только при запуске приложений
lpDirectoryString – рабочая директория
nShowCmdLong – параметры окна открытого файла (приложения, директории)

Параметры lpOperation, lpParametrs и lpDirectory можно опускать

Параметр nShowCmd может иметь значения от 0 до 10. Наиболее часто используемые значения:

SW_HIDE = 0 - запускаемое приложение делается невидимым
SW_SHOWMAXIMIZED = 3 - развернутое (максимальное) окно;
SW_SHOWMINIMIZED = 2 - свернутое окно (значок) в панель задач;
SW_SHOWNORMAL = 1 - нормальное окно.

Более полный список параметров можно взять из описания функции ShowWindow

Если функция возвращает значение больше 32-х, то всё в порядке, иначе смотрите коды ошибок.

0 - Недостаточно памяти или ресурсов
SE_ERR_FNF = 2 - Указанный файл не найден (ERROR_FILE_NOT_FOUND)
SE_ERR_PNF = 3 - Указанный путь не существует (ERROR_PATH_NOT_FOUND)
SE_ERR_ACCESSDENIED = 5 - Операционная система не имеет доступа к указанному файлу
SE_ERR_OOM = 8 - Недостаточно памяти или ресурсов Windows
ERROR_BAD_FORMAT = 11 - Формат .EXE неверен (не-Win32 .EXE или ошибка в .EXE файле).
SE_ERR_SHARE = 26 - Произошла ошибка совместного доступа
SE_ERR_DDETIMEOUT = 28 - Операция DDE не была закончена, потому что истекло время запроса
SE_ERR_DDEFAIL = 29 - Операция ПРЯМОГО ВВОДА ДАННЫХ потерпела неудачу
SE_ERR_DDEBUSY = 30 - Операция ПРЯМОГО ВВОДА ДАННЫХ(DDE) не может работать, потому что другие действия ПРЯМОГО ВВОДА ДАННЫХ находятся в процессе
SE_ERR_NOASSOC = 31 - Нет никакого приложения, ассоциированного с расширением файла
SE_ERR_DLLNOTFOUND = 32 - Указанный файл DLL не найден

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

Private Declare Function ShellExecute Lib "shell32" _
        Alias "ShellExecuteA" (ByVal hwnd As Long, _
        ByVal lpOperation As String, ByVal lpFile As String, _
        ByVal lpParameters As String, ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) As Long

Private Const SW_SHOWNORMAL = 1

Private Sub btnSend_Click()
' запуск почтовика для отправки письма
  ShellExecute 0, vbNullString, _
     "mailto:nemiro_as@vbnet.ru", vbNullString, _
     vbNullString, SW_SHOWNORMAL
End Sub

Private Sub btnSite_Click()
' открытие сайта
   ShellExecute(0,'open','www.am.rusimport.ru',,,sw_shownormal);
End Sub



Примечание.
Как и у многих других функции WinAPI, у ShellExecute существует два варианта: ShellExecuteA и ShellExecuteW. A- и W-версии отличаются типом строк: A - ASCII, W - WCHAR (юникоде). Не путайте. В Access используется тип А.

Используемые материалы
Дан Эпплман - Win32 API и Visual Basic
Сайт Cybite.ru - \http://kbyte.ru/ru/Programming/Guides.aspx?id=193&mode=show
Сайт Тостер - https://toster.ru/q/195225
и вот здесь - http://platonov-andrei.narod.ru/Delphi/FuncAPI/ShellExecute.htm


Замечания по изложению есть?

-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
15 янв 19, 12:07    [21785509]     Ответить | Цитировать Сообщить модератору
 Re: Функция API ShellExecute - описание и применение  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 629
Проще и с тем же результатом:
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "Путь"
Плюс, можно указать ожидание закрытия приложения.
15 янв 19, 13:32    [21785618]     Ответить | Цитировать Сообщить модератору
 Re: Функция API ShellExecute - описание и применение  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21502
Joss
Замечания по изложению есть?
1) Для lpOperation="edit" | "print" я бы добавил сведения о том, что происходит при отсутствии ассоциации.
2) При lpOperation="open" точно так же, как и для edit, обрабатывается ассоциация. Понятно, что менять ассоциацию для exefile дураков нет, но вот для иных типов исполняемых файлов - запросто. Да и наоборот - ничто не мешает ассоциировать любое расширение с исполняемым типом, и файл с ним именно запустится на исполнение как экзешник.
15 янв 19, 13:44    [21785642]     Ответить | Цитировать Сообщить модератору
 Re: Функция API ShellExecute - описание и применение  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5226
Кривцов Анатолий
Проще и с тем же результатом:
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "Путь"
Плюс, можно указать ожидание закрытия приложения.


А как Вы реализуете вот такую вещь?
sText = "mailto:Joss<mail@bk.ru>?Subject=Предложение по оптимизации"
Call ShellExecute(0, "open", sText, _
     vbNullString, vbNullString, SW_SHOWNORMAL)
15 янв 19, 15:44    [21785837]     Ответить | Цитировать Сообщить модератору
 Re: Функция API ShellExecute - описание и применение  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5226
Вопрос снимается. Запустилось
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """mailto:Joss<mail@bk.ru>?Subject=Предложение по оптимизации"""
15 янв 19, 15:56    [21785855]     Ответить | Цитировать Сообщить модератору
 Re: Функция API ShellExecute - описание и применение  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5226
Akina
Joss
Замечания по изложению есть?
1) Для lpOperation="edit" | "print" я бы добавил сведения о том, что происходит при отсутствии ассоциации.
2) При lpOperation="open" точно так же, как и для edit, обрабатывается ассоциация. Понятно, что менять ассоциацию для exefile дураков нет, но вот для иных типов исполняемых файлов - запросто. Да и наоборот - ничто не мешает ассоциировать любое расширение с исполняемым типом, и файл с ним именно запустится на исполнение как экзешник.


Вообще-то это функция и её вызов можно оформить вот так
x = ShellExecute(0, "edit", sText, _
vbNullString, vbNullString, SW_SHOWNORMAL)

Анализируешь переменную Х. Больше 32 - всё в порядке. Список ошибок я дал. При отсутствии ассоциации Х=31.
У меня так выдало.
15 янв 19, 16:05    [21785868]     Ответить | Цитировать Сообщить модератору
 Re: Функция API ShellExecute - описание и применение  [new]
vmag
Member

Откуда: MP
Сообщений: 4268
Кривцов Анатолий
Проще и с тем же результатом:


15 янв 19, 20:51    [21786174]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить