什么是ActiveX?
一组符合COM规范的工具,让开发人员使用新的或已有的工具把计算机桌面环境与www集成起来。
什么是OCX?
ActiveX控制(OCX)是微软媒体运动的定义技术,这些控制使开发人员能够以无缝的方式通过www为最终用户提交完整的应用。
面向对象的优缺点
面向对象解决了程序的向后兼容性,操作系统依赖性。OOP的接口是给外部函数调用的,私有函数只能够自己使用,外部无法访问,这就是封装性。当一个类继承另一个类时,它具有父类的接口,方法和字段,子类也能拓展新的方法。当不同的对象具有相同的接口时,它们就是多态的,这意味着开发人员可以开发通用的接口。
为什么要为COM组件声明一个GUID?HTML的object标签的classid属性里的CLSID为什么正好与COM对象的GUID对应
GUID标识一个对象的类标识或CLSID;或代表组件内的一个接口标识的IID。
为了让COM把GUID和含有对象的实际文件关联起来,应该使用注册表。
如何用C#开发一个COM组件?
请记住:想要把C#对象当作COM对象需要以下几点...
- class必须是public的
- 属性,方法和事件必须是public
- 属性和方法必须在Interface里面定义
- 事件必须在事件的接口中
未在接口中定义的成员,而在实现里面是public的成员,对COM是不可见的,但是对其他的.NET程序是可见的.为了把属性和方法暴露给COM,你必须在接口中定义他们,并且把他们用DispId属性标记.暴露给COM的那些属性方法其实就在类的实现里面.他们必须被标记为public,每一个接口都要有一个GUID属性。
在编译前,我们还需要在项目里设置一下:属性->应用程序->程序集信息 里勾选使程序集COM可见
来看下连接数据库的例子:
暴露的接口:
[Guid("694C1820-04B6-4988-928F-FD858B95C880")]
public interface DBCOM_Interface
{
[DispId(1)]
void Init(string userid , string password);
}
实现类:
[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public class DBCOM_Class : DBCOM_Interface
{
private SqlConnection myConnection = null ;
SqlDataReader myReader = null ;
public DBCOM_Class()
{
}
public void Init(string userid , string password)
{
try
{
string myConnectString = "user id="+userid+";password="+password+
";Database=NorthWind;Server=SKYWALKER;Connect Timeout=30";
myConnection = new SqlConnection(myConnectString);
myConnection.Open();
//MessageBox.Show("CONNECTED");
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
}
}
}
解释一下:ClassInterfaceType.None表示,这个类不会产生类接口.如果没有显式的接口实现,那么这个类只能提供对IDispatch的访问.用户期待通过接口导出该类显式实现了的成员.所以需要使用设置ClassInterfaceAttribute.
ComSourceInterfaces(typeof(DBCOM_Events))]标明标记的这个类会把接口暴露给COM事件源.在我们的例子中,没有什么需要暴露的..
转载自:[翻译]用C#写COM组件,《ActiveX开发人员指南》