导入CoCreateInstance原型很简单,但我却找不到一个C#中使用CoCreateInstance的较为完整的例子,它的各个参数具体应该赋什么值,如何得到它的返回值进而调用COM中的方法..麻烦大家给个代码示例,多谢!

解决方案 »

  1.   

    因为别人使用COM组件都是直接导入,导入后就能够直接使用各种方法。
      

  2.   

    C#使用COM对象不需要你去调用CoCreateInstance(即使不是自动化对象也一样)
    如果你想创建一个WSH对象(VBS和JS常用到这玩意),只需要写一个类:[ComImport]
    [Guid ("72C24DD5-D70A-438B-8A42-98424B88AFB8")]
    public class WScriptShell
    {
    }
    只要创建这个类的实例,.net平台的平台调用部分会替你调用CoCreateInstance.
    不过创建完成后返回的是一个object,你无法调用类的方法.所以你需要事先声明类的接口(WSH太长了,这里以IStream为例子)[ComImport]
    [InterfaceType(ComInterfaceType.IUnknown)]
    [Guid("0000000c-0000-0000-C000-000000000046")]
    public interface IStream
    {
        void Read([MarshalAs (UnmanagedType.LPArray)]
            byte[] pv,uint cb,out uint pcbRead);
        
        void Write([MarshalAs (UnmanagedType.LPArray)] 
            byte[] pv,uint cb,out uint pcbWritten);
        void Seek(long dlibMove, SeekOrigin dwOrigin, out long plibNewPosition);
        void SetSize(long libNewSize);
        void CopyTo(IStream pstm, long cb, out long pcbRead, out long pcbWritten);
        void Commit(uint grfCommitFlags);
        void Revert();
        void LockRegion(long libOffset, long cb, uint dwLockType);
        void UnlockRegion(long libOffset, long cb, uint dwLockType);
        void Stat(out System.Runtime.InteropServices.ComTypes.STATSTG stastg, STATFLAG grfStatflag);
        IStream Clone();
    }
    使用的时候假设你通过某条函数得到了一个IStream的object,直接把他强制转换成IStream接口的实例.
    .net会调用QueryInterface来确认对象是否能转成到指定接口的实例.转换成功后你就能像在C++里一样
    使用COM对象了.
      

  3.   

    感谢大家回贴,现在遇到另一个难题:现实COM的类中可否拥有静态成员,因为一个用来实现IE异步插件协议的COM组件是由我来定义,但却由WebBrowser控件调用。但是在WebBrowser控件调用前,我需要传递些数据进去。由于前面所述情况,只有静态成员可以满足要求。我首先创建一个COM对象,传递数据进去,webbrowser还要再创建一个对象,故需要静态成员。