检测IShellItem是否引用库的正确方法是什么?

时间:2013-05-14 12:55:12

标签: windows winapi

我正在使用FOS_PICKFOLDERS的公共文件对话框让用户选择一个位置来保存文件。如果用户选择库,例如Library\Documents然后我的当前代码在我调用IShellItem::GetDisplayName以提取文件系统名称时失败。如果该项目是文件,那么这将成功,并且将使用库的默认保存位置。

我想要做的是检测shell项是一个库,然后获取一个IShellLibrary接口,然后查询它以找到默认的保存位置。然后我会在那里保存我的文件。

检测IShellItem是否指向图书馆的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

使用SHLoadLibraryFromItem()IShellLibrary获取IShellItem,例如:

IShellItem *pItem, *pSave;
IShellLibrary *pLibrary;
...
if (SUCCEEDED(SHLoadLibraryFromItem(pItem, STGM_READWRITE, IID_IShellLibrary, (void**)&pLibrary)))
{
    pLibrary->GetDefaultSaveFolder(DSFT_DETECT, IID_IShellItem, (void**)&pSave);
    pLibrary->Release();
}
else
{
    pSave = pItem;
    pSave->AddRef();
}
...
pSave->GetDisplayName(...);
pSave->Release();

答案 1 :(得分:1)

我找到的唯一方法是使用IShellLibrary::LoadLibraryFromItemMSDN here),您传递IShellItem接口。

如果失败(即HRESULT != S_OK),那么IShellItem 一个库。

这样的事情:

bool IsLibrary(IShellItem *pItem)
{
    bool bIsLibrary = false;

    IShellLibrary *plib = NULL;
    HRESULT hr = CoCreateInstance(CLSID_ShellLibrary, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&plib));
    if (SUCCEEDED(hr))
    {
        hr = plib->LoadLibraryFromItem(pItem, STGM_READ);
        if (SUCCEEDED(hr)) bIsLibrary = true;
        plib->Release();
    }
    return bIsLibrary;
}

我不知道这是否是“正确的”方式,但无论如何它都可能有用。