Delphi и COM: проблемы с TLB и техническим обслуживанием - PullRequest
9 голосов
/ 20 августа 2008

В компании, в которой я работаю, мы разрабатываем весь графический интерфейс на 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 ]

10 голосов
/ 20 августа 2008

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

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

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

8 голосов
/ 02 сентября 2008

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

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

5 голосов
/ 13 сентября 2008

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

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

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

3 голосов
/ 19 сентября 2008

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

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

2 голосов
/ 19 сентября 2008

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

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

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

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

...