Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ассоциация файлов


Magedon ©   (2007-10-16 00:34:00) 

Доброе время суток, уважаемые.

Мне нужно ассоциировать некоторые типа файлов с моим приложением.
Почитав статьи, факи и мануалы, сделал несколько функций, которые проверяют, пишут, удаляют в ключике HKEY_CURRENT_USER\Software\Classes\.

Однако потом оказалось что если файлу вручную сказать открыться с помощью другого приложения и поставить галку чтобы оно запомнило, все проверки и установки в HKEY_CURRENT_USER\Software\Classes\не работают.

Порылся в реестре нашел что оно пишеться в Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\<Разширение>\P rogid.
Начал уитывать и это значение.

Но тут оказалось что в Висте и это не работает. Порывшись в вистовском реестре оказалось что они добавели в Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\<Разширение>\< /CODE> ключ
UserChoice\, с которым мне пока не удаеться управиться. Потому что программа не должна требовать хай-привелегий.

Скажите пожалуйста существует ли у винды какие то апишные функции для управления ассоциациями, которые сами для разных версий виндов будут красиво все проверять и устанавливать?


Magedon   (2007-10-16 14:38:00) [1]

> [10] ter   (16.10.07 13:34)
Спасибо, но это не совсем то что мне нужно. Это у меня есть и давно работает.

Только я пишу не в HKEY_CLASSES_ROOT, а в HKEY_CURRENT_USER\Software\Classes\потому что для вашего кода нужны права администратора. А у пользователя их может и не быть. А данные, записанные в HKEY_CURRENT_USER\Software\Classes\, Винда сама потом отобразит их в HKEY_CLASSES_ROOT. Это только если нужно регистрировать только для конкретного пользователя. Если же для всех, то в HKEY_LOCAL_MACHINE\Software\Classes\, но для этого потребуются админ. права. Советую так делать.

Кстати такая регистрация не всегда буде работать. Читайте первый пост [0] Magedon   (16.10.07 00:34)

Меня интересует другое, есть ли нечто стандартное виндовское которое само буде отслеживать все ассоциации и в \Software\Classes\, и в Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts. И учитывать особенности версий винды. Вот что мне нужно знать. Есть ли такой механизм. Или самому все отслеживать а с выходом новых виндов писать патчи.

Спасибо


ter   (2007-10-16 13:34:00) [2]

Function AssociateFileExt(FileExt, ProgramName, GRName, Info: String): Boolean;
Var R: TRegistry;
Begin
   R := TRegistry.Create;
   Result := False;
   Try
     R.RootKey := HKEY_CLASSES_ROOT;
     R.OpenKey('.'+FileExt,True);
     R.WriteString('',GRName);
     R.CloseKey;
     R.OpenKey(GRName,True);
     R.WriteString('',Info);
     R.CloseKey;
     R.OpenKey(GRName+'\DefaultIcon',True);
     R.WriteString('',ProgramName+' ,0');
     R.CloseKey;
     R.OpenKey(GRName+'\Shell',True);
     R.WriteString('','Open');
     R.CloseKey;
     R.OpenKey(GRName+'\Shell\Open\Command',True);
     R.WriteString('',ProgramName+' %1');
     R.CloseKey;
     R.Free;
     Result := True;
   Except
     R.Free;
   End;
End;

AssociateFileExt('myprog',ParamStr(0),'MYPROG','Документ "myprog"');


Magedon   (2007-10-16 12:13:00) [3]

Спасибо. Я понял ваши мнения по поводу ассоциации файлов, кто это должен делать и кто за это должен отвечать. Где-то и сам их разделяю. Однако программа не моя - я просто пишу что сказал начальник.
Однако я так и не получил ответа. Есть ли какаято группа апифункция, которая обслуживает ассоциирование файлов? И если есть подскажите.


Германн   (2007-10-16 01:51:00) [4]


> Хорошее приложение бы спросило. Раз не спросило - значит
> плохое, фтопку его. Если спросило, а юзер подтвердил (но
> не должен был) - это его глупость.

"Хорошее приложение" обязано не только спросить. "Хорошее приложение" обязаноещё и сохранить прежние настройки, чтобы вернуть их при деинсталляции. В данной ситуации "глупость юзера" не является оправданием собственных недоработок.


Ins   (2007-10-16 01:37:00) [5]


> [4] Magedon   (16.10.07 01:29)

По мне, так это будут исключительно проблемы юзера и того приложения, которой изменило ассоциации не спросив юзера об этом. Хорошее приложение бы спросило. Раз не спросило - значит плохое, фтопку его. Если спросило, а юзер подтвердил (но не должен был) - это его глупость. Вы не обязаны защищать свое приложение от глупостей пользователя. А если юзер exe-шник удалит? Тоже от этого защищаться будете?
Но если так уж хочется, то можете в своей программе сделать возможность (где-нибудь в опциях) принудительно установить/сбросить ассоциации, если вдруг они сброшены или юзер больше в них не нуждается.


Германн   (2007-10-16 01:35:00) [6]


> Magedon   (16.10.07 01:29) [4]

Вот и подтверждение моим словам в [5].
:-)


Германн   (2007-10-16 01:34:00) [7]


> Ins ©   (16.10.07 01:26) [2]
>
> Ну, а мое мнение - что это должен делать инсталлятор.

Не. Это должен делать автор программы. Ещё до её распространения! :)
И он похоже это уже понял. :)


> Потому что иначе, программу можно снести, а ассоциация останется.
>  А так - инсталлятор связал разширение, деинсталлятор "развязал".
>

"Связал/развязал" - тоже надо делать с умом.


Magedon   (2007-10-16 01:29:00) [8]

[2] Ins ©   (16.10.07 01:26)
Я с вами согласен. Но вот скажем такая ситуация:
Юзер после установки моего приложения устанавливает другое и автоматом прощелкивает ассоциации. Потом ему нужно вернуть. Так что ему инсталировать заново?


Ins   (2007-10-16 01:26:00) [9]

Ну, а мое мнение - что это должен делать инсталлятор. Потому что иначе, программу можно снести, а ассоциация останется. А так - инсталлятор связал разширение, деинсталлятор "развязал". Если юзер выберет для данного расширения другую программу - значит ему виднее, не нужно этому препятствовать, по ушам от юзеров получите.


Magedon   (2007-10-16 01:26:00) [10]

Спасибо вам за исчерпываючий ответ. Вы мне чень помогли. Сразу же имплементирую все что вы сказали в свое приложение.

Если бы я не задумывался то и не спрашивал.


Германн   (2007-10-16 01:12:00) [11]


> Скажите пожалуйста существует ли у винды какие то апишные
> функции для управления ассоциациями, которые сами для разных
> версий виндов будут красиво все проверять и устанавливать?
>

WinAmp знаешь? Никогда не задавался вопросом - почему у него есть в меню пункт, в котором можно в любоймомент времени зарегистрировать ассоциации его с файлами некоторых типов?
А браузеры разные не пробовал? Не задавался вопросом - почему они при старте говорят, что он не является "браузером по умолчанию" и спрашивают нужно его сделать таким?


Наверх

Титульная страница Поиск, карта сайта Написать письмо