Страница 1 из 1
Как вытащить из регистра программы, ассоциированные с типами
Добавлено: 18 Февраль 2013, 14:39
kreator
Хотелось бы узнать как вытащить из регистра (???) программы, которые ассоциированы с типами файлов, т.е. открывают файлы по умолчанию. Где лежит ассоциация, что .pdf открывается Adobe Reader 10, например.
Re: Как вытащить из регистра программы, ассоциированные с ти
Добавлено: 18 Февраль 2013, 16:07
Yufil
Добрый день
http://msdn.microsoft.com/ru-ru/library ... 85%29.aspx
Кусочег кода из реальной проги
Module('Windows API')
FindExecutable(*CSTRING,*CSTRING,*CSTRING),UNSIGNED,PASCAL,RAW,Name('FindExecutableA')
End
!-------------
Loc:lpFileName CSTRING(260) !
Loc:lpDirectory CSTRING(260) !
Loc:Res LONG !
Loc:Execute CSTRING(260) !
!---------------
Loc:Res=FindExecutable(Loc:LpFileName, Loc:LpDirectory, Loc:Execute)
If Loc:Res>32
Loc:Execute = Lower(Loc:Execute)
L# = Len(Loc:Execute)
If Loc:Execute[L#-3 : L#] = '.exe'
Plan:Executable = Loc:Execute
Else
Plan:Executable = ''
End
Else
Case Loc:Res
Of 2
Say('Для открытия файла ' & Loc:LpFileName & ' указана программа ' & Loc:Execute & '. Указанный файл не существует!')
Return(-1)
Of 3
Say('Путь доступа к файлу ' & Loc:LpFileName & ' неверен ')
Return(-1)
Of 5
Say('При открытии ' & Loc:LpFileName & ' возникла ошибка. К файлу нет доступа!')
Return(-1)
Of 8
Say('При открытии ' & Loc:LpFileName & ' возникла ошибка. Не хватает памяти или ресурсов!')
Return(-1)
Of 31
Say('Нет установленной программы для открытия файла ' & Loc:LpFileName )
Return(-1)
End
End
Re: Как вытащить из регистра программы, ассоциированные с ти
Добавлено: 19 Февраль 2013, 12:08
kreator
Спасибо большое. А то я весь реестр перерыл. Только проблема оказалась не совсем в этом. Мне нужна иконка, ассоциированная с файлом. Думал вытащить её из исполняемого файла, да не тут-то было. Юрий, может знаете как вытащить эту ассоциацию. Буду премного благодарен.
Re: Как вытащить из регистра программы, ассоциированные с ти
Добавлено: 19 Февраль 2013, 13:59
Дед Пахом
Код: Выделить всё
GetFileHIcon procedure(string path, byte isFolder)!,long
cpath cstring(260)
fileAttributes long,auto
shfi like(SHFILEINFO)
flags long(SHGFI_ICON + SHGFI_SMALLICON)
result long,auto
folderHIcon long(0),static
code
!optimization! give all directories the same image
if isFolder and folderHIcon > 0
return folderHIcon
end
cpath=clip(path)
if isFolder
fileAttributes = FILE_ATTRIBUTE_DIRECTORY
else
fileAttributes = FILE_ATTRIBUTE_NORMAL
end
result = SHGetFileInfo(cpath, fileAttributes, address(shfi), size(shfi), flags)
if result = 0
return 0
end
if isFolder
folderHIcon = shfi.hIcon
end
return shfi.hIcon
Re: Как вытащить из регистра программы, ассоциированные с ти
Добавлено: 20 Февраль 2013, 9:51
kreator
Не выходит каменный цветок, ума не хватает

.
Прототип такой -
Код: Выделить всё
UINT EQUATE(UNSIGNED)
IntPtr EQUATE(LONG)
SHGFI_LARGEICON EQUATE(00000000h)
SHGFI_SMALLICON EQUATE(00000001h)
SHGFI_ICON EQUATE(00000100h)
SHFILEINFO group, type
hIcon IntPtr
iIcon IntPtr
dwAttributes UINT
szDisplayName CSTRING(260)
szTypeName CSTRING(80)
end
SHGetFileInfo(*CSTRING,UINT,SHFILEINFO,LONG,LONG),UNSIGNED,PASCAL,RAW
Локальные переменные -
Код: Выделить всё
LOC:FileAttributes LONG, auto
LOC:SHFI LIKE(SHFILEINFO)
LOC:Flags LONG(SHGFI_ICON + SHGFI_SMALLICON)
LOC:File CSTRING(1024)
компилятор ругается на конструкцию - address(LOC:SHFI). Если убрать address, то всё путём. Но при обращении к функции программа вываливается. И, потом, что делать с Хэндлом иконки?
Re: Как вытащить из регистра программы, ассоциированные с ти
Добавлено: 20 Февраль 2013, 10:53
Дед Пахом
У меня так:
Код: Выделить всё
SHGetFileInfo(*cstring pszPath, long dwFileAttributes, long psfi, long cbFileInfo, long uFlags),long,raw,pascal,name('SHGetFileInfoA')
Код: Выделить всё
SHFILEINFO group,type
hIcon long
iIcon long
dwAttributes long
szDisplayName cstring(260)
szTypeName cstring(80)
end
А hIcon я сую в EasyListView контрол, ему этого хватает, чтоб картинку нарисовать. Попробуй через DrawIconEx(),
Re: Как вытащить из регистра программы, ассоциированные с ти
Добавлено: 20 Февраль 2013, 12:00
kreator
Пошло! Большущее спасибо! В прототипе - структуру надо, оказывается, описывать как LONG (Век живи - век учись, блин). Буду разбираться с хэндлом.
Re: Как вытащить из регистра программы, ассоциированные с ти
Добавлено: 06 Март 2013, 10:09
kreator
Хэндл не идёт. Нашёл WinAPI- шную функцию BitBlt. Вроде позволяет скопировать битмап из хэндла в хэндл. Меня бы устроило это. Хэндл своего Image я ведь могу получить? Кто-нибудь использовал эту функцию?