知识库(1)-如何在Win2K中使用SHMultiFileProperties

发表于:2007-07-01来源:作者:点击数: 标签:
在Win2k中SHMultiFileProperties函数不能用正确的剪贴板格式查询IdataObject 症状 当应用程序调用SHMultiFileProperties函数为一个或多个文件显示Shell属性对话框时无法使用CFSTR_SHELLIDLIST中的剪贴板格式来查询一列文件提供的IdataObject。 原因 在Win2K

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

原文转自:http://www.ltesting.net