2011-03-03 108 views
2

我解析了一些第三方软件“脚本”,它根据它的内容生成一个GUI窗体,我想在C#程序中读取脚本并生成类似的输出,这里是一个例子脚本:从CLSID动态加载ActiveX控件

BEGIN SECTION Intro 
    BACKPICTURE=xxxx.gif 
    PICTUREPOSN=Center 
    BEGIN CONTROL CLI 
    IS RADIO=NO 
     CLSID={49EBC3A3-727D-11CF-9BB9-080000001311} 
     POSITION=(24,16,250,45) 
     [email protected]:232 
     BEGIN PROPERTY Title 
     DISPID=2 
     SETTING=CLI : 
     TYPE=BSTR 
     END PROPERTY 
     BEGIN PROPERTY Arrangement 
     DISPID=3 
     SETTING=1 
     TYPE=I4 
     END PROPERTY 
     BEGIN PROPERTY EditBoxLength 
     DISPID=4 
     SETTING=3 
     TYPE=I4 
     END PROPERTY 

我感兴趣的是BEGIN CONTROLBEGIN PROPERTY这些指示ActiveX控件的开始和它的属性的属性。

我的问题:我将如何通过它的CLSID加载此ActiveX控件并设置其属性? Type.GetTypeFromCLSID似乎是我想要的,当我使用Activator.CreateInstance(Type)时,它不会抛出任何异常,因此它必须创建一个有效的实例,但如何设置一个属性,然后将此控件“绘制”为Windows窗体?

谢谢。

回答

4

这在.NET中很困难。一个ActiveX控件需要一个包装来给它一个好客的家。该包装器由AxHost类实现。不幸的是,你不能直接在代码中使用这个类,它的构造函数是受保护的。它被设计为由AxImp.exe工具使用。该工具自动生成一个派生自AxHost的.NET类。所得到的类随即可用作对照。问题在于,当你设计你的表单时,该工具需要预先运行。除了这里,这不是一个真正的问题。

你可以做的最好的事情是用AxImp为你在前面的脚本中找到的任何ActiveX控件创建包装。这可能是一个有限的子集。然后让脚本解释器根据clsid选择正确的包装器。像你想的那样动态地做它需要你创建你自己的包装。 AxHost然而不是一个小类和ActiveX托管是相当不愉快的许多细节照顾。

+0

感谢您的帮助汉斯。我开始用AxImp手动重新创建控件,但最终得到了一个GUID静态地图 - >我的控件,并从新创建了我自己的控件。 – eth0 2011-05-12 15:19:27