c# - 从 CLSID 动态加载 ActiveX 控件

标签 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 窗体?

谢谢。

最佳答案

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

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

关于c# - 从 CLSID 动态加载 ActiveX 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5179797/

相关文章:

com - COM 接口(interface)中的 WCHAR 是好事吗?

.net - 如何将 COM 导入 Ironpython?

multithreading - 这会使对象线程安全吗?

c++ - shell 扩展:IShellExtInit::Initialize 调用了 4 次

C# List - 添加到列表底部

c# - System.Net.FtpClient openwrite 不会上传文件,除非我在退出前插休眠眠

c# - PictureBox.Paint 事件持续触发

c# - 如何获取在windows azure中进行的查询的集合?

javascript - 生成 ActiveX 允许提示

JavaScript:ActiveX 对象和 apply() 函数的问题