从CLSID动态加载ActiveX控件

时间:2011-03-03 10:56:58

标签: c# com activex clsid

我正在解析一些第三方的软件“脚本”,根据它的内容生成一个GUI表单,我想在C#程序中读取脚本并产生类似的输出,这是一个示例脚本:

  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)
      QUESTION=@0: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窗体?

感谢。

1 个答案:

答案 0 :(得分:4)

这在.NET中很难。 ActiveX控件需要一个包装器来为它提供一个好客的家。该包装器由AxHost类实现。遗憾的是,您无法在代码中直接使用此类,其构造函数受到保护。它被设计为由AxImp.exe工具使用。该工具自动生成一个派生自AxHost的.NET类。然后,所得到的类可以容易地用作对照。问题是,在设计表单时,需要预先运行该工具。除了这里,这绝不是一个真正的问题。

您可以做的最好的事情是使用AxImp为您可能在该脚本中预先找到的任何ActiveX控件创建包装器。它可能是一个有限的子集。然后让脚本解释器根据clsid选择正确的包装器。像你想象的那样动态地做它需要你创建自己的包装器。然而,AxHost 不是一个小类,而且ActiveX托管非常不愉快,需要处理许多细节。