Как вытащить из регистра программы, ассоциированные с типами
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Как вытащить из регистра программы, ассоциированные с типами
Хотелось бы узнать как вытащить из регистра (???) программы, которые ассоциированы с типами файлов, т.е. открывают файлы по умолчанию. Где лежит ассоциация, что .pdf открывается Adobe Reader 10, например.
We are hard at work… for you. 

Re: Как вытащить из регистра программы, ассоциированные с ти
Добрый день
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
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
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Как вытащить из регистра программы, ассоциированные с ти
Спасибо большое. А то я весь реестр перерыл. Только проблема оказалась не совсем в этом. Мне нужна иконка, ассоциированная с файлом. Думал вытащить её из исполняемого файла, да не тут-то было. Юрий, может знаете как вытащить эту ассоциацию. Буду премного благодарен.
We are hard at work… for you. 

- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: Как вытащить из регистра программы, ассоциированные с ти
Код: Выделить всё
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
С уважением, ДП
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Как вытащить из регистра программы, ассоциированные с ти
Не выходит каменный цветок, ума не хватает
.
Прототип такой -
Локальные переменные -
компилятор ругается на конструкцию - address(LOC:SHFI). Если убрать address, то всё путём. Но при обращении к функции программа вываливается. И, потом, что делать с Хэндлом иконки?

Прототип такой -
Код: Выделить всё
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)
We are hard at work… for you. 

- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: Как вытащить из регистра программы, ассоциированные с ти
У меня так:
А hIcon я сую в EasyListView контрол, ему этого хватает, чтоб картинку нарисовать. Попробуй через DrawIconEx(),
Код: Выделить всё
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
Код: Выделить всё
shfi like(SHFILEINFO)
С уважением, ДП
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Как вытащить из регистра программы, ассоциированные с ти
Пошло! Большущее спасибо! В прототипе - структуру надо, оказывается, описывать как LONG (Век живи - век учись, блин). Буду разбираться с хэндлом.
We are hard at work… for you. 

-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Как вытащить из регистра программы, ассоциированные с ти
Хэндл не идёт. Нашёл WinAPI- шную функцию BitBlt. Вроде позволяет скопировать битмап из хэндла в хэндл. Меня бы устроило это. Хэндл своего Image я ведь могу получить? Кто-нибудь использовал эту функцию?
We are hard at work… for you. 
