Как вытащить из регистра программы, ассоциированные с типами

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Как вытащить из регистра программы, ассоциированные с типами

Сообщение kreator »

Хотелось бы узнать как вытащить из регистра (???) программы, которые ассоциированы с типами файлов, т.е. открывают файлы по умолчанию. Где лежит ассоциация, что .pdf открывается Adobe Reader 10, например.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Как вытащить из регистра программы, ассоциированные с ти

Сообщение 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
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Как вытащить из регистра программы, ассоциированные с ти

Сообщение kreator »

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

Re: Как вытащить из регистра программы, ассоциированные с ти

Сообщение kreator »

Не выходит каменный цветок, ума не хватает :mrgreen: .
Прототип такой -

Код: Выделить всё

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, то всё путём. Но при обращении к функции программа вываливается. И, потом, что делать с Хэндлом иконки?
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: Как вытащить из регистра программы, ассоциированные с ти

Сообщение Дед Пахом »

У меня так:

Код: Выделить всё

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)
А hIcon я сую в EasyListView контрол, ему этого хватает, чтоб картинку нарисовать. Попробуй через DrawIconEx(),
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Как вытащить из регистра программы, ассоциированные с ти

Сообщение kreator »

Пошло! Большущее спасибо! В прототипе - структуру надо, оказывается, описывать как LONG (Век живи - век учись, блин). Буду разбираться с хэндлом.
We are hard at work… for you. :)
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Как вытащить из регистра программы, ассоциированные с ти

Сообщение kreator »

Хэндл не идёт. Нашёл WinAPI- шную функцию BitBlt. Вроде позволяет скопировать битмап из хэндла в хэндл. Меня бы устроило это. Хэндл своего Image я ведь могу получить? Кто-нибудь использовал эту функцию?
We are hard at work… for you. :)
Ответить