原博文:http://blog.csdn.net/u012395622/article/details/46426043
为:http://bbs.125.la/thread-13770923-1-1.html 模块的源代码
当你执行了下面的代码,若你打开了IE浏览器不论数量 都会被远程操作跳转到我的博客上(容我小小调皮一下)。 首先我为什么不使用SHDocVw.Interop呢? 有些人可能知道,Visual Studio打包Interop COM库会区分[主/次] 版本号,一般Visual Studio COM打包是按照开发者电脑注册表中 的COM[主/次]版本号决定。不过这种情况一般针对Active OCX组件, 对与Interop则不会有这种问题。重写 Interop、反射 Refection 你不需要对用户负责 但一定要对自己负责 每次做的过程何不是一种提升呢? 你应该热爱它,专研它理解它,你会发现编程是一种很美妙很神奇令心向往。 示例代码:
[csharp] view plaincopy
- private void Form1_Load(object sender, EventArgs e)
- {
- object ppvComObject = null;
- try
- {
- Guid CLSID_ShellWindows = new Guid("9BA05972-F6A8-11CF-A442-00A0C90A8F39");
-
- Type pComType = Type.GetTypeFromCLSID(CLSID_ShellWindows, true);
- ppvComObject = Activator.CreateInstance(pComType);
-
- int webCount;
- if ((webCount = (int)pComType.InvokeMember("Count", BindingFlags.GetProperty, null, ppvComObject, null)) > 0)
- {
- for (int i = 0; i < webCount; i++)
- {
- object webObject = pComType.InvokeMember("Item", // IWebBrowser
- BindingFlags.InvokeMethod, null, ppvComObject, new object[] { i });
-
- webObject.GetType().InvokeMember("Navigate",
- BindingFlags.InvokeMethod, null, webObject, new object[] { "http://blog.csdn.net/u012395622" });
- }
- }
- }
- finally
- {
- if (ppvComObject != null && Marshal.IsComObject(ppvComObject))
- Marshal.ReleaseComObject(ppvComObject);
- }
- }
首先Type.GetTypeFromCLSID获取到COM对象的NET包装类型
然后再通过Activator.CreateInstance创建它的对象包装实例(System.__ComObject) 然后我们在通过Type.InvokeMember去调用它的方法/属性 整体是比较简单的 实际上这只是CLR中一种较为简单的反射机制的应用,但不能调用未注册的类型库。
|