使用ActiveX的疑惑

在项目开发期间打算把ActiveX的功能封装成一个类,然后重用。vs引入ActiveX是件很简单的事情,添加个引用或者把它放到工具箱里面拖放就好了。
整个封装过程都比较顺利,但是在该类的对象在使用的时候就发了一个奇怪的问题,在调用ActiveX函数时抛出了InvalidActiveXStateException异常。找了很久都不知道该异常的产生原因,但是如果把ActiveX直接拖到Form上该ActiveX的功能一切正常,于是怀疑是创建ActiveX的步骤除了什么问题。
在封装类里,ActiveX是直接创建的,就是new xxxxx;的写法。
下面是Form创建ActiveX的步骤:

 1
 2this.ActiveX1 = new ActiveXPack.AxCom();
 3((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).BeginInit();
 4
 5this.SuspendLayout();
 6
 7this.ActiveX1.Enabled = true;
 8this.ActiveX1.Location = new System.Drawing.Point(432256);
 9this.ActiveX1.Name = "ActiveX1";
10this.ActiveX1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("ActiveX1.OcxState")));
11this.ActiveX1.Size = new System.Drawing.Size(4046);
12this.ActiveX1.TabIndex = 9;
13
14
15((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).EndInit();
16this.ResumeLayout(false);
17

对比自己的做法,发现最大的不同是这么三行:
1
2((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).BeginInit();
3
4this.ActiveX1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("ActiveX1.OcxState")));
5
6((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).EndInit();
7

前后两行的意思应该就是通知ActiveX控件初始化开始和结束,而中间一行就是加载ActiveX控件的什么资源。

和异常的命名相关联很明显应该是由于封装类内少了为ActiveX加载资源这么一个步骤,而导致异常发生的。但是怎么加载呢?
上面第4行的resources的定义是:
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(testActiveXFrom));//testActiveXFrom是包含ActiveX控件的Form对象
这下就头大了,自己的封装类内既没有Form对象,也没有资源文件,这可怎么办?

最后就使用了一个无可奈何的办法,把封装类继承System.Windows.Forms.Form类,然后在设计界面上把改ActiveX这么一拖,写几个public的方法了事......

这样封装做好了,功能也正常了。不过还是搞不懂为什么会发生这样的问题,也搞不懂为什么要这样解决。而且后来也发现ActiveX也可以用在WebForm上,除了把这两个类作为容器外,其它的自定义的类包含ActiveX都会发生InvalidActiveXStateException异常(或者Control和COM也可以作为容器,没有求证过)。

搞不懂......

posted on 2008-01-09 13:32  baoli  阅读(678)  评论(2编辑  收藏  举报

导航