代码改变世界

解决方法:Unable to cast COM object of type 'Shell32.ShellClass' to interface 'Shell32.IShellDispatch5'

2013-03-17 02:12  随风浪迹天涯  阅读(3874)  评论(6编辑  收藏  举报

场景回顾:

我需要做一个功能,很简单,就是显示出本地所有的网络连接

比如在我的网络连接里有以下的items。

代码里需要引用:Interop.Shell32.dll 这个dll

解决方案:

VS 里面的Interop.Shell32.dll(1.0) 这个版本太低了,需要重新到别的网站下过比这个高的版本(我使用的是1.2.107.0)

解决过程:

我下面的代码就是找出所有上面的网络连接名字(有些人会推荐叫我用WMI,对 这个找出这个很easy,但是WMI 没法做我的一些进一步的需求。)

            Shell32.Shell shell = new Shell32.ShellClass();
            Shell32.Folder folder = shell.NameSpace(49);

            foreach (Shell32.FolderItem myItem in folder.Items())
            {
                listBox1.Items.Add(myItem.Name);
            }

然后 开始测试,因为我用的是Win 7 +VS 2010 所有结果很perfect ,看下图:

看,上面全部出来了。很正确,很开心,然后我就到XP 系统下面测试,悲剧了出现了下面的exception,

没办法啦,只好baidu或者google咯,就在老外的一篇文章中知道说到:Since I was developing under Vista, the RCW naturally assumed I wanted the latest interface (Shell32.IShellDispatch5). Windows XP only supports the Shell32.IShellDispatch4 interface.

指的是老外在Vista环境做的开发,因为Vista版本比XP的高,所以Xp不支持Shell32.IShellDispatch5,只支持Shell32.IShellDispatch4,ok,我进行转换了,

 var shell = (Shell32.IShellDispatch4)new Shell32.ShellClass();

可结果还是不行。

后来,想起是不是版本问题???、然后去重新下载了新的版本。。

我下来之后,有2个版本,在VS2010里的用的是第一个版本。请看:

后来我换成1.2.107 这个版本的,然后就ok啦。。

原因也就是上面的老外说的,版本问题。