Динамическая загрузка элементов управления ActiveX из CLSID

Я анализирую какой-то сторонний программный "скрипт", который генерирует форму графического интерфейса на основе его содержимого, и я хочу прочитать скрипт в программе на 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 CONTROL а также BEGIN PROPERTY поскольку они указывают на начало элемента управления ActiveX и его свойства.

Мой вопрос: как мне загрузить этот элемент управления ActiveX по его CLSID и установить его свойства? Type.GetTypeFromCLSID кажется, что я хочу, и он не выдает никаких исключений, когда я использую Activator.CreateInstance(Type) так что это должно быть создание действительного экземпляра, но как бы один из них задал свойства, а затем "нарисовал" этот элемент управления в форме Windows?

Благодарю.

1 ответ

Решение

Это сложно в.NET. Элемент управления ActiveX требует оболочки, чтобы дать ему гостеприимный дом. Эта оболочка реализована классом AxHost. К сожалению, вы не можете использовать этот класс непосредственно в коде, его конструкторы защищены. Он был разработан для использования инструментом AxImp.exe. Этот инструмент автоматически генерирует класс.NET, производный от AxHost. Полученный класс затем легко использовать в качестве элемента управления. Проблема в том, что этот инструмент нужно запускать заранее, пока вы создаете свою форму. Это никогда не проблема, кроме как здесь.

Лучшее, что вы можете сделать, - это создать оболочки с AxImp для любого элемента управления ActiveX, который вы когда-либо найдете в этом скрипте. Вероятно, это будет ограниченное подмножество. Затем попросите интерпретатора сценариев выбрать правильную оболочку на основе clsid. Чтобы сделать это динамически, как вы и предполагали, вам нужно создать свою собственную оболочку. AxHost, однако, не маленький класс, и хостинг ActiveX довольно неприятен со многими деталями, о которых нужно позаботиться.

Другие вопросы по тегам