Форум: "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