Delphi и COM:Проблемы с TLB и техническим обслуживанием

StackOverflow https://stackoverflow.com/questions/16897

  •  08-06-2019
  •  | 
  •  

Вопрос

В компании, в которой я работаю, мы разрабатываем весь графический интерфейс на C #, но ядро приложения в основном разрабатывается на Delphi 5 (по историческим причинам), с большим количеством компонентов, сделанных на COM +.В связи с этим очень специфическим видом приложения у меня есть два вопроса:

  • Ребята, имеющие опыт работы с Delphi и / или COM, есть ли у вас какие-либо обходные пути для работы с глючным интерфейсом TLB?Вот некоторые из ошибок:Сбой IDE во время выпуска большого TLB, потеря идентификаторов методов, повреждение TLB и т.д.Здесь мы не нашли ни одного хорошего решения.На самом деле мы попытались выполнить обновление до новой версии 2007.Но новый интерфейс IDE TLB содержит те же ошибки, которые мы находили ранее.

  • Как вы управляете версиями TLBs ?Файл TLB находится в двоичном формате, и разрешить конфликт очень сложно.Мы пытались сделать это, экспортируя описания интерфейсов в IDL и фиксируя их в CVS, но мы не нашли никакого хорошего способа генерировать TLB из IDL с использованием Delphi.Кроме того, инструмент MIDL, предоставленный Microsoft, неправильно проанализировал IDL-файлы, которые мы экспортировали из delphi.

Это было полезно?

Решение

Я думаю, вам следует хорошенько ознакомиться с Delphi 2009.

В Delphi 2009 внесены изменения в поддержку COM, включая текстовую замену двоичных файлов TLB.

Вы можете прочитать больше на Блог Криса Бенсена.

Другие советы

В далеком прошлом (до того, как я начал работать в CodeGear) Я отказался от странного языка IDL, основанного на Delphi, который представляла IDE, и написал свой собственный IDL и скомпилировал его с помощью MS midl.Это в значительной степени сработало;единственная загвоздка, IIRC, заключалась в том, чтобы убедиться, что dispids (атрибут id) были правильными в интерфейсах автоматизации (dispinterfaces) для средств получения и установки свойств - был некоторый инвариант, который ожидал tlibimp, но midl не гарантировал.

Однако теперь, когда Delphi 2009 использует безопасное подмножество синтаксиса midl и включает в себя компилятор для этого midl в комплекте и интегрирован в IDE, эти проблемы должны уйти в прошлое.

Мы также только что установили Delphi 2009, и, похоже, он улучшил поддержку библиотек типов.Однако я довольно долго работал с библиотеками COM и type, и вот мои общие подводные камни, которые я обнаружил за эти годы.Я бы согласился, что он довольно глючный и работает вплоть до Delphi 2006 (наша версия до использования 2009).

  • Всегда предоставляйте возможность записи каждого файла перед открытием.Это может показаться очевидным, но при работе с системой управления версиями иногда мы забываем это сделать и пытаемся снять флаг только для чтения после открытия файла - Delphi не может справиться с этим.Перед открытием убедитесь, что tlb доступен для записи.
  • При редактировании автономной библиотеки типов у вас ДОЛЖЕН быть открыт проект.По какой-то причине, если вы откроете библиотеку типов сами по себе, она не сохранится.Создайте пустой проект, а затем откройте свою библиотеку типов.По какой-то причине это позволяет сохранить библиотеку типов.
  • Если ваша библиотека типов используется приложением или COM +, убедитесь, что приложение закрыто или COM + отключен, прежде чем открывать библиотеку типов.Любые открытые приложения будут препятствовать сохранению библиотеки типов.

Однако я думаю, что ваше лучшее решение, вероятно, - это обновление.Вы также получаете поддержку Unicode.

Использование Delphi 2009 значительно облегчило работу с огромными файлами TLB, и преобразование наших существующих объектов было безболезненным, но наши com-объекты не используют никаких сторонних библиотек.

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

Такой же опыт работы с интерфейсом TLB здесь:мы просто перестали им пользоваться.

Мы работаем с несколькими отдельными файлами IDL (ручная сборка) для разных частей нашего фреймворка, используя конструкцию #include для включения их в IDL реального приложения, затем генерируем единый tlb с помощью MIDL и tlibimp его.Если приложение не имеет собственного IDL, доступны предварительно скомпилированные версии различных файлов TLB framework.

Всякий раз, когда фреймворк переходит на новую версию, запускается скрипт для повторной генерации GUID для всех необходимых интерфейсов в файлах IDL.

Это хорошо служило нам в течение многих лет, и для перехода на новый набор инструментов Delphi 2009 IDL / TLB должен быть не только интегрирован в IDE, но и универсален, когда дело доходит до автоматизированных сборок и еще много чего.Не могу дождаться, когда запачкаю руки кое-какими экспериментами!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top