在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); } } 
|