powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Функция API ShellExecute - описание и применение
7 сообщений из 7, страница 1 из 1
Функция API ShellExecute - описание и применение
    #39759709
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, для общего сведения

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

Объявление
для VBA 6
Код: vbnet
1.
2.
3.
4.
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
Код: vbnet
1.
2.
3.
4.
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 не найден

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
Функция API ShellExecute - описание и применение
    #39759736
Проще и с тем же результатом:
Код: vbnet
1.
2.
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "Путь"

Плюс, можно указать ожидание закрытия приложения.
...
Рейтинг: 0 / 0
Функция API ShellExecute - описание и применение
    #39759747
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossЗамечания по изложению есть?1) Для lpOperation="edit" | "print" я бы добавил сведения о том, что происходит при отсутствии ассоциации.
2) При lpOperation="open" точно так же, как и для edit, обрабатывается ассоциация. Понятно, что менять ассоциацию для exefile дураков нет, но вот для иных типов исполняемых файлов - запросто. Да и наоборот - ничто не мешает ассоциировать любое расширение с исполняемым типом, и файл с ним именно запустится на исполнение как экзешник.
...
Рейтинг: 0 / 0
Функция API ShellExecute - описание и применение
    #39759843
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривцов АнатолийПроще и с тем же результатом:
Код: vbnet
1.
2.
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "Путь"

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

А как Вы реализуете вот такую вещь?
Код: vbnet
1.
2.
3.
sText = "mailto:Joss<mail@bk.ru>;?Subject=Предложение по оптимизации"
Call ShellExecute(0, "open", sText, _
     vbNullString, vbNullString, SW_SHOWNORMAL)
...
Рейтинг: 0 / 0
Функция API ShellExecute - описание и применение
    #39759856
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос снимается. Запустилось
Код: vbnet
1.
2.
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """mailto:Joss<mail@bk.ru>;?Subject=Предложение по оптимизации"""
...
Рейтинг: 0 / 0
Функция API ShellExecute - описание и применение
    #39759868
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaJossЗамечания по изложению есть?1) Для lpOperation="edit" | "print" я бы добавил сведения о том, что происходит при отсутствии ассоциации.
2) При lpOperation="open" точно так же, как и для edit, обрабатывается ассоциация. Понятно, что менять ассоциацию для exefile дураков нет, но вот для иных типов исполняемых файлов - запросто. Да и наоборот - ничто не мешает ассоциировать любое расширение с исполняемым типом, и файл с ним именно запустится на исполнение как экзешник.

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


Анализируешь переменную Х. Больше 32 - всё в порядке. Список ошибок я дал. При отсутствии ассоциации Х=31.
У меня так выдало.
...
Рейтинг: 0 / 0
Функция API ShellExecute - описание и применение
    #39760000
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривцов АнатолийПроще и с тем же результатом:

YouTube Video
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Функция API ShellExecute - описание и применение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]