Страница 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
Не выходит каменный цветок, ума не хватает :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, то всё путём. Но при обращении к функции программа вываливается. И, потом, что делать с Хэндлом иконки?

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

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

shfi          like(SHFILEINFO)
А hIcon я сую в EasyListView контрол, ему этого хватает, чтоб картинку нарисовать. Попробуй через DrawIconEx(),

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

Добавлено: 20 Февраль 2013, 12:00
kreator
Пошло! Большущее спасибо! В прототипе - структуру надо, оказывается, описывать как LONG (Век живи - век учись, блин). Буду разбираться с хэндлом.

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

Добавлено: 06 Март 2013, 10:09
kreator
Хэндл не идёт. Нашёл WinAPI- шную функцию BitBlt. Вроде позволяет скопировать битмап из хэндла в хэндл. Меня бы устроило это. Хэндл своего Image я ведь могу получить? Кто-нибудь использовал эту функцию?