【问题标题】:Loading ActiveX controls dynamically from CLSID从 CLSID 动态加载 ActiveX 控件
【发布时间】:2011-03-03 10:56:58
【问题描述】:

我正在解析一些第三方软件“脚本”,它会根据其内容生成 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 窗体?

谢谢。

【问题讨论】:

    标签: c# com activex clsid


    【解决方案1】:

    这在 .NET 中很难。 ActiveX 控件需要一个包装器来给它一个好客的家。该包装器由 AxHost 类实现。不幸的是,你不能直接在代码中使用这个类,它的构造函数是受保护的。它旨在供 AxImp.exe 工具使用。该工具会自动生成一个派生自 AxHost 的 .NET 类。然后,生成的类很容易用作控件。问题是,该工具需要在您设计表单时预先运行。这从来都不是真正的问题,除了这里。

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

    【讨论】:

    • 感谢汉斯的帮助。我开始使用 AxImp 手动重新创建控件,但最终获得了 GUID 的静态映射 -> 我的控件并从新创建我自己的控件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多