Динамическая загрузка элементов управления ActiveX из CLSID - PullRequest
2 голосов
/ 03 марта 2011

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

4 голосов
/ 03 марта 2011

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

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

...