现在的位置: 首页 > 综合 > 正文

wpf中使用Com

2018年08月04日 ⁄ 综合 ⁄ 共 1878字 ⁄ 字号 评论关闭

第一种:在工程中引用,这种方法快捷,但问题很多;
第二种:使用Type和Activator来创建一个com对象
                首先应引入库using System.Runtime.InteropServices;
                然后在需要的地方加入如下:
                                  Type type = Type.GetTypeFromProgID("AMediaPlayer.Player");

                                  或

                                {
                                              Guid clsid = new Guid();
                                               int hr = CLSIDFromProgID("AMediaPlayer.Player", ref clsid);
                                               Type type = Type.GetTypeFromCLSID(clsid); //此处的guid应该是(CLSID associated with the data and code),否则会报错

                                   }
                                object obj = Activator.CreateInstance(type);
                                IPlayer pPlayer = obj as IPlayer; //IPlayer 是个接口
               然后就可以使用pPlayer对象了

               这里要注意的就是上面那两个函数的用法,CLSIDFromProgID 和GetTypeFromProgID。上面都写的应该清楚了;
第三种:使用CoCreateInstance来创建一个实例
                首先也要引入using System.Runtime.InteropServices;
               然后在类中
[DllImport("ole32.dll", ExactSpelling = true)]
        private static extern int CoCreateInstance(
            [In] ref Guid clsid,
            IntPtr pUnkOuter,
            uint context,
            [In] ref Guid iid,
            [Out] out IntPtr ppv);

        [DllImport("ole32.dll", ExactSpelling = true)]
        private static extern int CLSIDFromProgID(
            [MarshalAs(UnmanagedType.LPWStr)] string progid,
            ref Guid clsid);
以上应该是代理,具体概念不知道,本是搞c++的。
   Guid clsid = new Guid();
   int hr = CLSIDFromProgID("AMediaPlayer.Player", ref clsid); //CLSID associated with the data and code
   
    Guid idispatch_id = new Guid("3A2A90D6-1255-4D5C-86C0-B8694B712C66");//这个是接口guid
    IntPtr pIDispatch;
    hr  = CoCreateInstance(ref clsid,IntPtr.Zero,1, // CLSCTX_INPROC_SERVER
        ref idispatch_id,
        out pIDispatch);
    object obj = Marshal.GetObjectForIUnknown(pIDispatch);
    IPlayer pPlayer = obj as IPlayer; //IPlayer 是个接口

这三种都测试过了,都能用,第二种是最方便的。可能有些地方会写漏,但大概是这样的

抱歉!评论已关闭.