Как узнать программно какое приложение, открывает по умолчанию файлы pdf

Автор Ципихович Эндрю, 29 февраля 2024, 10:53

0 Пользователи и 1 гость просматривают эту тему.

Ципихович Эндрю

Цитата: economist от  1 марта 2024, 08:17Нельзя сдаваться, пройдя 3/4 пути. IT любит усидчивых.
я и не сбираюсь, спасибо за инфу
про портейбл версию - забыл, так как не пользуюсь такой))

mikekaganski

Цитата: Ципихович Эндрю от  1 марта 2024, 06:37не работает с буфером обмена
Работает.
Цитата: Ципихович Эндрю от  1 марта 2024, 06:37надо общаться с админом о её установке
Это не её минус, а минус политики на предприятии.

Но в принципе оба пункта - офтопик здесь.

По теме: вот код, который делает поиск приложения, ассоциированного с PDF, правильно (на Windows):

Declare Function AssocQueryStringA Lib "Shlwapi" (ByVal assocf As Long, ByVal assocstr As Long, ByVal assoc As String, ByVal extra As String, ByVal out As String, ByRef cch As Long) As Long

const ASSOCF_NONE                  = &h00000000
const ASSOCF_INIT_NOREMAPCLSID     = &h00000001
const ASSOCF_INIT_BYEXENAME        = &h00000002
const ASSOCF_OPEN_BYEXENAME        = &h00000002
const ASSOCF_INIT_DEFAULTTOSTAR    = &h00000004
const ASSOCF_INIT_DEFAULTTOFOLDER  = &h00000008
const ASSOCF_NOUSERSETTINGS        = &h00000010
const ASSOCF_NOTRUNCATE            = &h00000020
const ASSOCF_VERIFY                = &h00000040
const ASSOCF_REMAPRUNDLL           = &h00000080
const ASSOCF_NOFIXUPS              = &h00000100
const ASSOCF_IGNOREBASECLASS       = &h00000200
const ASSOCF_INIT_IGNOREUNKNOWN    = &h00000400
const ASSOCF_INIT_FIXED_PROGID     = &h00000800
const ASSOCF_IS_PROTOCOL           = &h00001000
const ASSOCF_INIT_FOR_FILE         = &h00002000

const ASSOCSTR_COMMAND = 1
const ASSOCSTR_EXECUTABLE = 2
const ASSOCSTR_FRIENDLYDOCNAME = 3
const ASSOCSTR_FRIENDLYAPPNAME = 4
const ASSOCSTR_NOOPEN = 5
const ASSOCSTR_SHELLNEWVALUE = 6
const ASSOCSTR_DDECOMMAND = 7
const ASSOCSTR_DDEIFEXEC = 8
const ASSOCSTR_DDEAPPLICATION = 9
const ASSOCSTR_DDETOPIC = 10
const ASSOCSTR_INFOTIP = 11
const ASSOCSTR_QUICKTIP = 12
const ASSOCSTR_TILEINFO = 13
const ASSOCSTR_CONTENTTYPE = 14
const ASSOCSTR_DEFAULTICON = 15
const ASSOCSTR_SHELLEXTENSION = 16
const ASSOCSTR_DROPTARGET = 17
const ASSOCSTR_DELEGATEEXECUTE = 18
const ASSOCSTR_SUPPORTED_URI_PROTOCOLS = 19
const ASSOCSTR_PROGID = 20
const ASSOCSTR_APPID = 21
const ASSOCSTR_APPPUBLISHER = 22
const ASSOCSTR_APPICONREFERENCE = 23

Function GetAssociatedExecutable(extension As String) As String
  Dim out As String, cch As Long, hresult As Long
  out = String(32767, " ") ' A buffer of a large size, likely enough for any case
  cch = Len(out)
  hresult = AssocQueryStringA(ASSOCF_NONE, ASSOCSTR_EXECUTABLE, extension, "open", out, cch)
  If hresult < 0 Then GetAssociatedExecutable = "" Else GetAssociatedExecutable = out
End Function

Sub PDFProg1()
  MsgBox GetAssociatedExecutable(".pdf")
End Sub

Этот код не занимается безнадёжной задачей поиска в реестре (как отметил @bigor, это зависит от кучи переменных, и только MS знает правильный алгоритм поиска в этой своей помойке). Вместо этого код использует функцию Windows API AssocQueryStringA, которая предназначена специально для этой задачи. Код начинается с объявления, после чего задаёт кучу констант (вот эти константы в принципе я сделал для полноты - если большую часть из них убрать, и оставить только две, используемые при вызове, то код сильно уменьшится). А уж правильный поиск в реестре - головная боль этой функции.

Обратите внимание, что для функции готовится буфер из 32 К символов. Работа с WinAPI из Basic - отдельная неблагодарная тема.

И да, чтобы вернуть ProgID (как в #2) вместо пути ассоциированного приложения (что сделал я), нужно в вызове заменить ASSOCSTR_EXECUTABLE на ASSOCSTR_PROGID.
С уважением,
Михаил Каганский

Ципихович Эндрю

спасибо за код, более информативно отработал:
C:\Program Files\Mozilla Firefox\firefox.exe
а в ворде упал, не подскажите как поправить, чтобы там тоже работал?

sokol92

Цитата: Ципихович Эндрю от  1 марта 2024, 11:11а в ворде упал, не подскажите как поправить, чтобы там тоже работал?
=Offtop ^ 2

В VBA (версия офиса не ниже 2010) замените определение функции на
Private Declare PtrSafe Function AssocQueryStringA Lib "shlwapi.dll" _
   (ByRef flags As Long, _
    ByVal str As Long, _
    ByVal hkAssoc As String, _
    ByVal pszExtra As String, _
    ByVal pszOut As String, _
    ByRef pcchOut As Long) As Long
Владимир.

Ципихович Эндрю

Цитата: economist от  1 марта 2024, 08:17если будете слушаться моих советов
ок
дошли руки хотел опробовать
Цитата: economist от  1 марта 2024, 08:17Без админов все делается в Portable-версиях (64/32 - это X-LibreOffice из WinPenPack и "c офсайта LO" ссылка на PortableApps.com соответствеенно)
не понял я думал что это сразу либра портабл, зашёл туда не понял, как там действовать? спасибо

economist

Качаете, распаковываете, ставите расширения, словари, ru-справку итд, настраиваете, добавляете макросы, чините Python итд.

А потом уже раздаете полностью готовый архив LO (архив в 8 раз меньше, т.е. 150 МБ против 1ГБ). Он будет работать с любого носителя (диска, флешки, сетевой папки).
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

понял
не хило, а готового пусть со всем лишним = 1Тб нет, просто опробовать))

economist

Обычный "установленный" LO на диске имеет такой же размер ~1GB.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...



4_3

Цитата: mikekaganski от 29 февраля 2024, 14:39Не за что! Всегда обращайтесь, когда Вам лень попробовать самостоятельно. У нас времени хоть отбавляй.
боюсь, что лень тут ни при чем =(