Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.06;
Скачать: CL | DM;

Вниз

Ассоциация файлов   Найти похожие ветки 

 
Magedon   (2007-10-16 00:34) [0]

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

Мне нужно ассоциировать некоторые типа файлов с моим приложением.
Почитав статьи, факи и мануалы, сделал несколько функций, которые проверяют, пишут, удаляют в ключике 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\, с которым мне пока не удаеться управиться. Потому что программа не должна требовать хай-привелегий.

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


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


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

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


 
Ins ©   (2007-10-16 01:26) [2]

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


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

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

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


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

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


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


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

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


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

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


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


> Magedon   (16.10.07 01:29) [4]

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


 
Ins ©   (2007-10-16 01:37) [7]


> [4] Magedon   (16.10.07 01:29)

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


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


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

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


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

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


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

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 14:38) [11]

> [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. И учитывать особенности версий винды. Вот что мне нужно знать. Есть ли такой механизм. Или самому все отслеживать а с выходом новых виндов писать патчи.

Спасибо



Страницы: 1 вся ветка

Текущий архив: 2008.07.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
2-1212792183
redlord
2008-06-07 02:43
2008.07.06
отображение каретки ввода в компоненте edit


4-1192480485
Magedon
2007-10-16 00:34
2008.07.06
Ассоциация файлов


15-1211546863
Val
2008-05-23 16:47
2008.07.06
Исключения в RemoteDataModuleCreate


2-1212846927
9899100
2008-06-07 17:55
2008.07.06
INI


2-1212682369
leonidus
2008-06-05 20:12
2008.07.06
Работа с файлом формата UTF8