【问题标题】:Windows Shell Extension doesn't give exact file pathsWindows Shell 扩展没有给出确切的文件路径
【发布时间】:2014-02-18 09:03:37
【问题描述】:

目前我正在编写一个 Shell 扩展,因为扩展文件上下文菜单的常规方式不适合我的需要,但是我在这里遇到了同样的问题。

如果我右键单击单个快捷方式(*.lnk 文件),我会得到它的目标路径,如果我选择许多文件并右键单击快捷方式,我只会得到一个文件 - 快捷方式目标文件。

我的shell扩展还没有完成,但枚举文件的部分代码是这样的:

HRESULT CFileContextMenuExt::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
{
    HRESULT hr = E_INVALIDARG;
    if (NULL == pdtobj)
    {
        return hr;
    }

    FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
    STGMEDIUM stm = {};

    // pDataObj contains the objects being acted upon. In this example, 
    // we get an HDROP handle for enumerating the selected files.
    if (SUCCEEDED(pdtobj->GetData(&fe, &stm)))
    {
        // Get an HDROP handle.
        HDROP hDrop = static_cast<HDROP>(GlobalLock(stm.hGlobal));
        if (hDrop != NULL)
        {
            // Determine how many files are involved in this operation.
            UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
            if (nFiles != 0)
            {
                m_selectedFiles.clear();

                //Enumerates the selected files and directories.
                for (UINT i = 0; i < nFiles; i++)
                {
                    // Get the next filename.
                    int size = DragQueryFile(hDrop, i, NULL, 0) + 1;
                    string_t str;
                    str.resize(size);
                    if (DragQueryFile(hDrop, i, &str[0], size) == 0)
                        continue;

                    m_selectedFiles.push_back(str);
                }
                hr = S_OK;
            }

            GlobalUnlock(stm.hGlobal);
        }

        ReleaseStgMedium(&stm);
    }

    // If any value other than S_OK is returned from the method, the context 
    // menu is not displayed.
    return hr;
}

有人可以建议如何获得确切的路径而不是目标吗?

【问题讨论】:

标签: c++ windows shell shell-extensions


【解决方案1】:

(我不确定以下解决方案是否绝对正确,可能在某些情况下无法正常工作,但在标准情况下我已经测试过它可以正常工作)

您必须在 * 和 lnkfile 下注册上下文菜单处理程序。这意味着当用户右键单击快捷方式 QueryContextMenu 将被调用两次。第一次是快捷方式文件目标,第二次是快捷方式文件本身。但有细微差别。对于快捷方式文件目标 shell 始终传递 CMF_VERBSONLY 并且快捷方式文件本身不存在此标志。因此,只需检查此标志,如果存在则不添加任何内容。

【讨论】:

  • 你说的是静态动词还是动态shell扩展?
  • @ST3 我说的是动态
猜你喜欢
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2012-10-19
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多