当前位置:编程学习 > C#/ASP.NET >>

win7环境下使用Shell32获取系统文件夹,部署在xp环境中出错,如何解决?

win7环境下使用Shell32遍历系统文件夹,如下例:
Shell32.Shell shell32 = new Shell32.ShellClass();
Shell32.Folder shell32Folder = shell32.NameSpace(Win32API.ShellFolder.MyComputer);
Shell32.Folder desktopFolder = shell32.NameSpace(Win32API.ShellFolder.DesktopDirectory);
Shell32.FolderItems folderItems = desktopFolder.ParentFolder.Items();
foreach(Shell32.FolderItem folderItem in folderItems)
 { 
   if(folderItem.Name == desktopFolder.Title)
   {
      _parentListViewItem = new FolderListViewItem(folderItem);
      break;
   }
 }
但是部署在winxp上报错:
System.InvalidCastException: 无法将类型为“Shell32.ShellClass”的 COM 对象强制转换为接口类型“Shell32.IShellDispatch5”。
此操作失败的原因是对 IID 为“{866738B9-6CF2-4DE8-8767-F794EBE74F4E}”的接口的 COM 组件调用 QueryInte易做图ce 因以下错误而失败: 不支持此接口...

====================================================
只有将程序在winxp上重新编译一下,才可以。请问能否不需要在xp重新编译的情况下,正常部署。 --------------------编程问答-------------------- 问题好像是获取系统图标代码的地方,因为在wi7下能够正常执行下列代码
  // Get the System IImageList object from the Shell:
                Guid iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
                int ret = SHGetImageList(
                    (int)size,
                    ref iidImageList,
                    ref iImageList
                    );
在win xp下就报错。但是参照网上一段代码:
    /// <summary>
        /// Creates the SystemImageList
        /// </summary>
        private void create()
        {
            // forget last image list if any:
            hIml = IntPtr.Zero;

            if (isXpOrAbove())
            {
                // Get the System IImageList object from the Shell:
                Guid iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
                int ret = SHGetImageList(
                    (int)size,
                    ref iidImageList,
                    ref iImageList
                    );
                // the image list handle is the IUnknown pointer, but 
                // using Marshal.GetIUnknownForObject doesn't return
                // the right value.  It really doesn't hurt to make
                // a second call to get the handle:
                SHGetImageListHandle((int)size, ref iidImageList, ref hIml);
            }
            else
            {
                // Prepare flags:
                SHGetFileInfoConstants dwFlags = SHGetFileInfoConstants.SHGFI_USEFILEATTRIBUTES | SHGetFileInfoConstants.SHGFI_SYSICONINDEX;
                if (size == SysImageListSize.smallIcons)
                {
                    dwFlags |= SHGetFileInfoConstants.SHGFI_SMALLICON;
                }
                // Get image list
                SHFILEINFO shfi = new SHFILEINFO();
                uint shfiSize = (uint)Marshal.SizeOf(shfi.GetType());

                // Call SHGetFileInfo to get the image list handle
                // using an arbitrary file:
                hIml = SHGetFileInfo(
                    ".txt",
                    FILE_ATTRIBUTE_NORMAL,
                    ref shfi,
                    shfiSize,
                    (uint)dwFlags);
                System.Diagnostics.Debug.Assert((hIml != IntPtr.Zero), "Failed to create Image List");
            }
        }
也不行啊。 --------------------编程问答-------------------- 出错的地方是:
Shell32.Shell shell32 = new Shell32.ShellClass();
Shell32.Folder shell32Folder = shell32.NameSpace(ShellFolder.MyComputer);

就是第二句话 --------------------编程问答-------------------- Shell32不是系统DLL 吗?如果不是你在XP 上面注册一下regsvr32 Shell32.dll --------------------编程问答-------------------- 最快的办法...在XP下开发该软体代码测试即可 --------------------编程问答-------------------- Win7 和 XP 的 Shell32.dll 文件不同吧 --------------------编程问答-------------------- 好像要使用
  Type shellType = Type.GetTypeFromProgID("Shell.Application");
  object shellObject = System.Activator.CreateInstance(shellType);
具体如何使用,有人用过吗?

--------------------编程问答-------------------- 在Win7下运行,就用 win7的 System32.dll
在XP 下运行,就用 XP的 System32.dll

不需要重新编译。试试看。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,