Создание новой версии C # существующего COM-объекта для использования в программе Delphi - PullRequest
2 голосов
/ 10 июля 2009

У нас была небольшая проблема, когда мы потеряли некоторый исходный код для очень старого компонента ActiveX, который у нас был. У нас есть программа Delphi7, которая вызывает компонент Active X. Это что-то вроде мотра и не может быть изменено слишком сильно. Однако некоторые функции в компоненте Active X необходимо обновить. Поскольку мы переместили наши приложения на C #, было решено переделать ActiveX как библиотеку классов C #.

У меня есть базовая библиотека классов C #, работающая над подтверждением этой концепции. Я могу взломать GUID и реестр, чтобы он выглядел как старый. Если я посмотрю на тип lib для старого и нового, они в основном одинаковы. Пара небольших различий, но не все, что я мог бы подумать, будет проблемой.

Теперь, насколько я понимаю, есть три способа использования новой библиотеки классов:

  1. Позднее связывание с поиском ProgId. Это работает нормально.

  2. Импорт библиотеки типов. (Проект | Библиотека типов импорта) Это работает нормально.

  3. Импорт в качестве компонента ActiveX. Это создает файл TLB. Это не работает Когда я иду, чтобы создать компонент, я получаю «Такой интерфейс не существует». Класс загружается в точку, но не полностью.

Теперь, к сожалению, программа Delphi использует вариант 3. Поэтому я должен попытаться заставить мою библиотеку классов работать в таких условиях. Есть идеи, как мне пройти эту ошибку? Я гуглил и нашел несколько ссылок, но ничего не говорит о том, в чем проблема.

Второй вопрос. Я должен знать, как это сделать, так как я сделал это однажды, но я, кажется, ошибся. Когда я нахожусь в Delphi, я делаю компонент Import ActiveX для создания файла TLB. Теперь первая сгенерированная библиотека классов C # отображается в списке элементов управления ActiveX, и я могу создать для нее модуль. Но я создал еще одну более простую библиотеку классов для целей тестирования и, черт побери, могу ли я заставить библиотеку отображаться в списке элементов управления ActiveX и поэтому не могу ее импортировать.

Create Unit для компонента Active X генерирует другой формат TLB.pas в соответствии с форматом библиотеки типов импорта и его ActiveX, который мне требуется.

Ответы [ 2 ]

2 голосов
/ 10 июля 2009

ActiveX Control делает гораздо больше, чем просто реализует ваши интерфейсы. Это больше похоже на TComponent или TWinControl. Это требует, чтобы вы реализовали намного больше интерфейсов ActiveX Control. Ваш объект C #, предоставляемый через COM / ActiveX, является не элементом управления, а простым классом.

Не отображается в элементе управления ActiveX импорта, поскольку он не является элементом управления ActiveX. Я не думаю, что возможно сделать ваш класс C # активным элементом управления.

1 голос
/ 11 июля 2009

Другая возможность, хотя, возможно, и не самая элегантная, заключается в создании нового объекта ActiveX com в Delphi, который, в свою очередь, вызывает ваш класс C # любым из методов, с которыми вы уже работали.

Поскольку вы заявили, что это для существующего приложения Delphi 7, вы можете просто использовать Com Interop на стороне C #, представить объект как видимый com и использовать его непосредственно из приложения Delphi 7.

Первый вариант, вероятно, позволит вам обойтись минимальными изменениями в существующем приложении, но добавляет дополнительный слой, который, скорее всего, не нужен.

...