![](/img/trans.png)
[英]What is the correct way to detect if ruby is running on Windows?
[英]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.