C#中如何使用CoCreateInstance ? 导入CoCreateInstance原型很简单,但我却找不到一个C#中使用CoCreateInstance的较为完整的例子,它的各个参数具体应该赋什么值,如何得到它的返回值进而调用COM中的方法..麻烦大家给个代码示例,多谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为别人使用COM组件都是直接导入,导入后就能够直接使用各种方法。 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对象了. 感谢大家回贴,现在遇到另一个难题:现实COM的类中可否拥有静态成员,因为一个用来实现IE异步插件协议的COM组件是由我来定义,但却由WebBrowser控件调用。但是在WebBrowser控件调用前,我需要传递些数据进去。由于前面所述情况,只有静态成员可以满足要求。我首先创建一个COM对象,传递数据进去,webbrowser还要再创建一个对象,故需要静态成员。 在DataGridView中追加数据表问题 如何让ObjectContext不要回滚事务? 重写OnPaint,Graphics重绘问题 在TreeView中添加TreeNode,如何用代码让一个Node变为选中状态?在线等。。。 请大家指点一下这个算法!!! InitialData控件 控制台问题 高手们!!请进来帮过忙!! 用SandCastle生成的help2文件,HxS等,在VS环境下按F1就可用? 很现实的问题。DotNET能做到象java那样在IE里动态看股市行情吗? c#智能设备 问题大侠请进…… 关于拼图游戏的一个问题
如果你想创建一个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对象了.