Delphi и COM: TLB и проблемы обслуживания

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

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

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

Ответов (5)

Решение

Я думаю, вам стоит хорошенько взглянуть на 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 и библиотеками типов, и вот мои общие ошибки, которые я обнаружил за эти годы. Я бы согласен, что это довольно глючная версия, вплоть до Delphi 2006 (наша версия до использования 2009).

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

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

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

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

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

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

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

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