2013-03-21 6 views

ответ

1

К сожалению, регистрация расширений файлов может быть немного сложно работать. Существует нет окончательного API для извлечения той информации, которую вы ищете. Существует интерфейс IQueryAssociations, но он не дает вам большой гибкости в том, как он запрашивает. Это скорее запрос 1 к 1, но вместо этого вы ищете запрос Many-to-1. Таким образом, вам придется копаться в реестре напрямую для этой информации.

Используйте RegOpenKeyEx(), чтобы открыть улей и перечислить все его непосредственные подразделы с помощью RegEnumKeyEx(), ища имена ключей, начинающиеся с периода. Это даст вам список известных расширений файлов.

Для каждого HKEY_CLASSES_ROOT\<ext> ключа, проверьте:

  1. (Default) значение, которое содержит не пустую строку. Если присутствует, то это ProgID расширения файла. Вы можете открыть ключ HKEY_CLASSES_ROOT\<ProgID> и посмотреть, есть ли в нем какие-либо shell\<verb>\command подразделы, которые содержат путь приложения (может присутствовать несколько значений <verb>, поэтому вам придется их перечислить). Если нет, проверьте, имеет ли ключ ProgID ключ CLSID. Если присутствует, то его значение (Default) будет CLSID COM-объекта, который обрабатывает все, что связано с этим ProgID. Вы можете открыть ключ HKEY_CLASSES_ROOT\CLSID\<CLSID> и проверить, есть ли в нем раздел InprocHandler, InprocHandler32, InprocServer или InprocServer32, содержащий полный путь к файлу EXE или DLL, которому принадлежит этот COM-объект.

  2. a PersistentHandler подраздел. Если присутствует, то его значение (Default) будет CLSID COM-объекта, который обрабатывает это расширение файла. Вы можете проверить CLSID по мере необходимости.

  3. a OpenWithProgIds подразделение. Если он присутствует, он будет содержать список ProgID, которые вы можете проверить по мере необходимости.

  4. OpenWithList подраздел. Если он присутствует, он будет содержать список зарегистрированных имен приложений. Вы можете открыть ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\<AppName>, чтобы получить полный путь к каждому приложению.

Есть несколько других возможностей (ShellEx ключи, ключи DDE, другие Shell связанных ключей COM объектов и т.д.), но я думаю, что вы видите точку. Существует потенциальная возможность копания, чтобы выяснить, какое приложение обрабатывает данное расширение файла.