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

2

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

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

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

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

  • Импортируйте библиотеку типов. (Project | Import Type Library) Это работает нормально.

  • Импорт в качестве компонента ActiveX. Это создает файл tlb. Это не работает. Когда я иду, чтобы создать компонент, я получаю "Нет такого интерфейса существует". Класс загружается в точку, но не полностью.

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

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

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

Теги:
com
activex

2 ответа

2

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

Он не отображается в Import ActiveX Control, поскольку он не является элементом управления ActiveX. Я не думаю, что можно сделать свой класс С# активным.

  • 0
    Но первый пример, который я создал, обнаруживается в моем списке элементов управления ActiveX. Но я не могу понять, как это появилось там! И TLB для этого почти точно так же, как оригинальный TLB!
1

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню