簡體   English   中英

檢測IShellItem引用庫的正確方法是什么?

[英]What is the correct way to detect that an IShellItem refers to a Library?

我正在將公用文件對話框與FOS_PICKFOLDERS配合使用,以使用戶選擇保存文件的位置。 如果用戶選擇一個庫,例如Library\\Documents則我當前的代碼在我調用IShellItem::GetDisplayName提取文件系統名稱時失敗。 如果該項目是文件,則將成功,並且將使用庫的默認保存位置。

我想做的是檢測外殼項目是一個庫,然后獲取IShellLibrary接口,然后查詢它以找到默認的保存位置。 然后,我將文件保存在那里。

檢測IShellItem引用庫的正確方法是什么?

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

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();

我發現的唯一方法是使用IShellLibrary::LoadLibraryFromItem此處MSDN ),並向其傳遞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;
}

我不知道這是否是“正確”的方法,但是無論如何它可能還是有用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM