【问题标题】:Getting File Associations using Windows API使用 Windows API 获取文件关联
【发布时间】:2010-08-21 06:40:09
【问题描述】:

我正在使用 C++ 为 Windows 开发基于控制台的文件浏览器,并且很难将列出与文件关联的操作并在其上调用命令的上下文菜单组合在一起。目前最大的问题是让操作与文件类型相关联。

我知道在 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),因为默认键留空,而另一个键(“PercievedType”)设置为音频...我该如何获取此类操作的操作?

最后,如果有更好的方法来做到这一点,我很乐意听到,但我通常讨厌与注册表打交道。我宁愿有一个简单的 Windows 调用来获取操作和命令...

【问题讨论】:

    标签: c++ windows registry file-type file-association


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 对于决定在 Windows 8 及更高版本上使用此功能的用户请注意。无文件关联时返回的可执行路径为C:\WINDOWS\system32\OpenWith.exe
    • @c00000fd,在 Windows 7+ 中,您可以避免使用带有标志 ASSOCF_INIT_IGNOREUNKNOWN 的默认 openwith.exe。
    【解决方案2】:

    考虑使用IContextMenu。 IContextMenu 是 Windows 资源管理器访问文件和项目上下文菜单的方式。

    Raymond Chen 的这个article 提供了如何访问给定文件路径的 IContextMenu 并使用它来使用一组可用命令填充 HMENU 的示例代码。这是series of articles 中的第一个,它提供了一个不错的概述以及示例代码。

    【讨论】:

    • 谢谢!这正是我希望这样做的方式!这篇文章很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多