相关疑难解决方法(0)

如何将SHCreateItemFromParsingName与Shell命名空间中的名称一起使用?

我正在使用SHCreateItemFromParsingName路径转换为IShellItem

IShellItem ParseName(String path)
{
    IShellItem shellItem;

    HRESULT hr = SHCreateItemFromParsingName(path, null, IShellItem, out shellItem);
    if (Failed(hr)) 
        throw new ECOMException(hr);
    return shellItem;
}
Run Code Online (Sandbox Code Playgroud)

注意:A IShellItem于2006年左右推出,旨在为Windows 95时代IShellFolder+ pidl构造提供方便的包装。你甚至可以问IShellItem咳嗽了它的基础IShellFolder,并pidlIParentAndItem.GetParentAndItem接口和方法。

不同的事物具有不同的显示名称

我可以在shell名称空间中找到一些众所周知的位置,并查看它们的绝对解析SIGDN_DESKTOPABSOLUTEPARSING)和编辑SIGDN_DESKTOPABSOLUTEEDITING)显示名称:

| Path              | Editing               | Parsing                                                           |
|-------------------|-----------------------|-------------------------------------------------------------------|
| C:\               | "C:\"                 | "C:\"                                                             |
| C:\Windows        | "C:\Windows"          | "C:\Windows"                                                      |
| Desktop …
Run Code Online (Sandbox Code Playgroud)

windows winapi windows-shell

5
推荐指数
1
解决办法
2182
查看次数

路径不存在时的SHParseDisplayName

我正在开发一个替代IFileOpenDialogIFileSaveDialog

我几乎可以使用它(至少是IFileOpenDialog),但是当我要返回IShellItem代表新文件名(用户已选择保存在GetResult()方法中)的时,我将无法SHParseDisplayName使用该新文件名。我总是收到一个错误"The system cannot find the file specified"

我将欣赏一些示例或其他解决方案,也许可以解决我的问题。

编辑:

    HRESULT CFileSaveDialogProxy::GetResult( __RPC__deref_out_opt IShellItem **ppsi)
    {
        //return m_Original->GetResult(ppsi);

        WCHAR pszPath[MAX_PATH] = {0};
        HRESULT hr = ERROR_CANCELLED;

        if (m_SelectedFiles.size() > 0)
        {
            QString s = m_SelectedFiles.at(0);
            s.replace(QString("/"),QString("\\"));
            s.toWCharArray(pszPath);

            //PCIDLIST_ABSOLUTE pIdL = ILCreateFromPath(pszPath);
            PIDLIST_ABSOLUTE pIdL = NULL;
            SFGAOF out;
            hr = SHParseDisplayName(pszPath,NULL,&pIdL,SFGAO_FILESYSTEM,&out);
            if (SUCCEEDED(hr))
            {
                hr = SHCreateItemFromIDList(pIdL, IID_PPV_ARGS(ppsi));
            }
        }

        return hr;
    }
Run Code Online (Sandbox Code Playgroud)

c++ winapi windows-shell

3
推荐指数
1
解决办法
2690
查看次数

标签 统计

winapi ×2

windows-shell ×2

c++ ×1

windows ×1