使用ActiveX的疑惑
在项目开发期间打算把ActiveX的功能封装成一个类,然后重用。vs引入ActiveX是件很简单的事情,添加个引用或者把它放到工具箱里面拖放就好了。
整个封装过程都比较顺利,但是在该类的对象在使用的时候就发了一个奇怪的问题,在调用ActiveX函数时抛出了InvalidActiveXStateException异常。找了很久都不知道该异常的产生原因,但是如果把ActiveX直接拖到Form上该ActiveX的功能一切正常,于是怀疑是创建ActiveX的步骤除了什么问题。
在封装类里,ActiveX是直接创建的,就是new xxxxx;的写法。
下面是Form创建ActiveX的步骤:
对比自己的做法,发现最大的不同是这么三行:
前后两行的意思应该就是通知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也可以作为容器,没有求证过)。
搞不懂......
整个封装过程都比较顺利,但是在该类的对象在使用的时候就发了一个奇怪的问题,在调用ActiveX函数时抛出了InvalidActiveXStateException异常。找了很久都不知道该异常的产生原因,但是如果把ActiveX直接拖到Form上该ActiveX的功能一切正常,于是怀疑是创建ActiveX的步骤除了什么问题。
在封装类里,ActiveX是直接创建的,就是new xxxxx;的写法。
下面是Form创建ActiveX的步骤:
1

2
this.ActiveX1 = new ActiveXPack.AxCom();
3
((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).BeginInit();
4

5
this.SuspendLayout();
6

7
this.ActiveX1.Enabled = true;
8
this.ActiveX1.Location = new System.Drawing.Point(432, 256);
9
this.ActiveX1.Name = "ActiveX1";
10
this.ActiveX1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("ActiveX1.OcxState")));
11
this.ActiveX1.Size = new System.Drawing.Size(40, 46);
12
this.ActiveX1.TabIndex = 9;
13

14
15
((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).EndInit();
16
this.ResumeLayout(false);
17



2
this.ActiveX1 = new ActiveXPack.AxCom();3
((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).BeginInit();4


5
this.SuspendLayout();6


7
this.ActiveX1.Enabled = true;8
this.ActiveX1.Location = new System.Drawing.Point(432, 256);9
this.ActiveX1.Name = "ActiveX1";10
this.ActiveX1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("ActiveX1.OcxState")));11
this.ActiveX1.Size = new System.Drawing.Size(40, 46);12
this.ActiveX1.TabIndex = 9;13


14

15
((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).EndInit();16
this.ResumeLayout(false);17


对比自己的做法,发现最大的不同是这么三行:
1

2
((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).BeginInit();
3

4
this.ActiveX1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("ActiveX1.OcxState")));
5

6
((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).EndInit();
7



2
((System.ComponentModel.ISupportInitialize)(this.ActiveX1)).BeginInit();3


4
this.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也可以作为容器,没有求证过)。
搞不懂......
浙公网安备 33010602011771号