Windows Vista, API программ по умолчанию, ассоциации форматов файлов и (не) установщики - взрывоопасная смесь! - PullRequest
4 голосов
/ 23 марта 2010

Мое приложение довольно хорошо ведет себя в Windows, поэтому, когда я перенес его на Windows Vista / 7, я заменил свой код ассоциации пользовательских форматов файлов на поддержку Программ по умолчанию API. Однако при попытке сделать деинсталлятор для моего приложения я столкнулся с проблемой - кажется, удалить ассоциации форматов файлов с помощью Программ по умолчанию API.

Я пытался вызвать IApplicationAssociationRegistration :: ClearUserAssociations, но фактически удаляет все ассоциации, в том числе и для других приложений, - полностью восстанавливая состояние ОС по умолчанию (что, конечно, недопустимо).

Я пытался вызвать IApplicationAssociationRegistration :: SetAppAsDefault , чтобы вернуть ассоциации форматов файлов предыдущему «владельцу» - но это не помогает, потому что мое приложение обрабатывает много уникальных форматов файлов, которые ОС не поддерживает, и нет прежних "владельцев". И Windows не позволяет передавать пустые строки в SetAppAsDefault ...

Так что мне делать? Есть хорошие решения?

Ответы [ 4 ]

1 голос
/ 03 апреля 2010

Я думаю, что вы используете Программы по умолчанию API неправильно. Если я правильно понимаю, функциональность программ по умолчанию была добавлена ​​Microsoft из-за юридических требований заменить Internet Explorer в качестве браузера по умолчанию. Он предлагает другой набор функций, чем обычные ассоциации файлов, используемые приложениями. Если вам нужно зарегистрировать простую ассоциацию файлов, я бы посоветовал вам придерживаться старого поведения.

С MSDN: Программы по умолчанию (Windows) :
Программы по умолчанию в первую очередь предназначен для приложений, использующих стандартные типы файлов, такие как файлы .mp3 или .jpg, или стандартные протоколы, такие как HTTP или mailto. Приложения, использующие собственные проприетарные протоколы и ассоциации файлов, обычно не используют функциональность Программы по умолчанию .

0 голосов
/ 09 апреля 2010

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

0 голосов
/ 09 апреля 2010

Примечание : Все приведенные ниже соображения применимы, даже если вы напрямую изменяете ассоциации файлов в реестре вместо использования API программ по умолчанию.

При первом запуске ваше приложение должно собратьпредыдущие владельцы всех типов файлов, для которых существует, через IApplicationAssociationRegistration::QueryCurrentDefault и сохраните их в хранилище, принадлежащем вашему приложению.

При удалении ваше приложение должно использовать IApplicationAssociationRegistration::SetAppAsDefault попытаться восстановить любое сопоставление файлов, которое все еще принадлежит предыдущему владельцу.Для ассоциаций, которыми ваше приложение все еще владеет, но не знает предыдущих владельцев, перейдите в реестр HKCR и удалите соответствующую запись типа расширения, протокола или MIME.Не прикасайтесь к каким-либо ассоциациям, ваше приложение не является текущим владельцем - вы перезапишете выбор пользователя.

Я бы очень хотел, чтобы пакетное резервное копирование при первом запуске и очистка при удалении были предоставлены какодин вызов API из API программ по умолчанию, но пока они не решат обобщить это поведение для всех приложений, вы будете самостоятельно.

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

Вы можете автоматизировать очистку для каждого пользователя, добавив простую задачу для каждого пользователя, которая выполняет описанные выше шаги в планировщике задач.,Задача будет запланирована на выполнение один раз, а затем удалит себя из пользовательского планировщика задач.Единственная потенциальная проблема с этим подходом состоит в том, что, поскольку вы не знаете, сколько пользователей будет, вы не сможете узнать, когда удалить dll для этой задачи с машины.Опять же, если вы оставите эту DLL в папке ProgramData, это не имеет большого значения.

0 голосов
/ 08 апреля 2010

Правильный код для связи вашего расширения файла с приложением, использует настройки реестра Windows. Обычно это делается для всей машины (независимо от пользователя) с помощью куста реестра HKEY_LOCAL_MACHINE\SOFTWARE\Classes, который также более удобен для доступа через псевдоним HKEY_CLASSES_ROOT (ярлык реестра).

Ваш процесс состоит из трех этапов:

  1. Сохранение "старых" настроек перед установкой приложения (кстати, приятно, что вы это делаете. Многие приложения просто удаляют сопоставление!)

  2. Создание собственных ассоциаций. Хорошим примером того, как это сделать, является Изменение сопоставлений файлов с редактором реестра . Подробное объяснение на MSDN:

  3. При удалении восстановите сохраненные «старые» настройки из шага (1) и переписайте установленные значения с этими исходными. В случае отсутствия «старых» настроек хорошее гражданство означало бы полное удаление ключа класса из реестра.

Одним из инструментов, помогающих отладить и увидеть, как изменяются сопоставления классов (расширений), является FileAsoc Windows File Association Editor . Это позволяет вам восстанавливать расширения файлов при отладке вашего приложения. Веб-страница также дает краткое объяснение того, как именно хранятся значения.

Надеюсь, это поможет!

...