Получение файловых ассоциаций с использованием Windows API - PullRequest
3 голосов
/ 21 августа 2010

Я работаю над консольным файловым браузером для Windows на C ++ и испытываю трудности с получением контекстного меню, в котором перечислены действия, связанные с файлом, и для них вызываются команды. Самая большая проблема сейчас связана с привязкой действий к типам файлов.

Мне известен процесс открытия и настройки ключей реестра в HKEY_CLASSES_ROOT, но я не могу найти способ фактически получить действия и их команды, чтобы из него можно было создать контекстное меню.

Общая структура этих ассоциаций в реестре:

HKEY_CLASSES_ROOT \ (расширение) \ (по умолчанию) - тип файла
HKEY_CLASSES_ROOT \ filetype \ (по умолчанию) - описание типа файла
HKEY_CLASSES_ROOT \ filetype \ shell \ action \ (по умолчанию) - описание действия
HKEY_CLASSES_ROOT \ filetype \ shell \ action \ command \ (по умолчанию) - команда вызывается для файла

Мне интересно, есть ли способ (надеюсь, с использованием Windows API), что я могу получить все действия, связанные с типом файла. По крайней мере, тогда я могу проверить эти действия для их команд в реестре ...

Кроме того, этот подход, похоже, не работает с некоторыми распространенными типами файлов (например, mp3) в моей системе, поскольку ключ по умолчанию оставлен пустым, а другой ключ ("PerctainedType") установлен на аудио ... получить действия для чего-то вроде этого?

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

Ответы [ 2 ]

7 голосов
/ 21 августа 2010

Попробуйте это (обработка ошибок опущена для краткости):

TCHAR szBuf[1000];
DWORD cbBufSize = sizeof(szBuf);
HRESULT hr = AssocQueryString(0, ASSOCSTR_FRIENDLYAPPNAME,
   argv[1], NULL, szBuf, &cbBufSize);
if (FAILED(hr)) { /* handle error */ }
CStringA strFriendlyProgramName(szBuf, cbBufSize);

cbBufSize = sizeof(szBuf);
hr = AssocQueryString(0, ASSOCSTR_EXECUTABLE, 
   argv[1], NULL, szBuf, &cbBufSize);
if (FAILED(hr)) { /* handle error */ }
CStringA strExe(szBuf, cbBufSize);

std::cout << strFriendlyProgramName << " (" << strExe << ")" << std::endl;
2 голосов
/ 21 августа 2010

Рассмотрите возможность использования IContextMenu .IContextMenu - это то, как Windows Explorer получает доступ к контекстному меню для файлов и элементов.

Эта статья Рэймонда Чена содержит пример кода для доступа к IContextMenu для заданного пути к файлу и его использования для заполненияHMENU с набором доступных команд.Это первая из серии статей , в которой содержится хороший обзор вместе с образцом кода.

...