Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.042 c
2-1212920874
ply
2008-06-08 14:27
2008.07.06
где в БД хранить картинки?


15-1210089446
Anatoly Podgoretsky
2008-05-06 19:57
2008.07.06
Тестирование NNTP сервера


6-1190026272
AlexxXes
2007-09-17 14:51
2008.07.06
Нужен ли прокси?


2-1212514901
tango
2008-06-03 21:41
2008.07.06
объясните пожалуйста, что значит каждая из процедур?


3-1201365475
leonidus
2008-01-26 19:37
2008.07.06
Ищу простую СУБД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский