在Win2k中SHMultiFileProperties函数不能用正确的剪贴板格式查询IdataObject
症状
当应用程序调用SHMultiFileProperties函数为一个或多个文件显示Shell属性对话框时无法使用CFSTR_SHELLIDLIST中的剪贴板格式来查询一列文件提供的IdataObject。
原因
在Win2K中,Shell32.dll维持一组已注册的剪贴板格式。当一个自定义的IdataObject实现被传递给SHMultiFileProperties,Shell32.dll的剪贴板格式数组可能没有被初始化。结果是SHMultiFileProperties使用0作为剪贴板格式Id来调用IDataObject::GetData。
解决方法
在调用SHMultiFileProperties之前,调用的应用程序必须确保Shell32.dll已经初始化它的剪贴板格式数组。下面的函数通过创建一个IdataObject来强制Shell32.dll去初始化它的剪贴板格式数组。
STDAPI_(void) ForceShellToRegisterClipboardFormats(void)
{
LPITEMIDLIST pidlDrives;
IShellFolder* psfDesktop;
IDataObject* pdata;
HRESULT hr;
hr = SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidlDrives);
if (SUCCEEDED(hr))
{
hr = SHGetDesktopFolder(&psfDesktop);
if (SUCCEEDED(hr))
{
hr = psfDesktop->GetUIObjectOf(NULL,
1,
(LPCITEMIDLIST*)&pidlDrives,
IID_IDataObject,
NULL,
(void**)&pdata);
if (SUCCEEDED(hr))
{
pdata->Release();
}
psfDesktop->Release();
}
ILFree(pidlDrives);
}
}