У нас была небольшая проблема, когда мы потеряли некоторый исходный код для очень старого компонента 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, который мне нужен.
Элемент управления ActiveX позволяет вам просто реализовать свои интерфейсы. Это больше похоже на TComponent или TWinControl. Это требует, чтобы вы реализовали намного больше интерфейсов управления ActiveX. Ваш объект С#, открытый через COM/ActiveX, не является элементом управления, а просто классом.
Он не отображается в Import ActiveX Control, поскольку он не является элементом управления ActiveX. Я не думаю, что можно сделать свой класс С# активным.
Другая возможность, хотя, вероятно, и не самая элегантная, - создать новый объект ActiveX com в Delphi, который, в свою очередь, вызывает ваш класс С# любым способом, который у вас уже есть.
Поскольку вы заявили, что это для существующего приложения Delphi 7, вы можете просто использовать Com Interop на стороне С#, выставить объект как COM видимым и использовать его непосредственно из приложения Delphi 7.
Первый вариант, вероятно, позволит вам пройти с минимальными изменениями в существующем приложении, но добавит дополнительный слой, который, скорее всего, не нужен.