使用Windows API获取文件关联

Nic*_*win 3 c++ windows registry file-type file-association

我正在使用基于控制台的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 \( default) - 在文件上调用的命令

我想知道是否有办法(希望使用Windows API)我可以获得与文件类型相关的所有操作.至少那时我可以在注册表中检查这些操作的命令...

此外,这种方法似乎不适用于我的系统上的一些常见文件类型(例如mp3),因为默认键是空白而另一个键("PercievedType")设置为音频...我怎样才能获得操作对于这样的事情?

最后,如果有更好的方法来做到这一点,我很乐意听到它,我通常讨厌处理注册表.我宁愿有一个简单的Windows调用,它会让我获得动作和命令......

小智 7

试试这个(为简洁省略了错误处理):

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;
Run Code Online (Sandbox Code Playgroud)