Использование в Delphi классов, созданных в Visual C++

ОГЛАВЛЕНИЕ

Обоснование

Необходимость использования чужого кода в своей программе возникает регулярно. Вставка готовых удачных решений позволяет не изобретать велосипед заново. В хороших случаях чужой код написан на том же языке, что и свой, либо решение оформлено в виде DLL или компонента. Однако, бывают случаи похуже. Например, приобретается PCI-плата расширения с программным обеспечением для нее, а это ПО оказывается файлами исходного кода на С или С++, в то время как проект уже начат на Delphi, и, кроме того, в команде разработчиков С++ знают плохо.

Варианты решения

В принципе, можно весь проект писать на С++. Если такая возможность есть - не исключено, что это лучший выход. Но пользовательский интерфейс в Delphi разрабатывается быстрее, чем в MS VC++ (не только мое мнение, но хорошую цитату не нашел), кроме того, в группе могут плохо знать С++. И если даже С++ знают хорошо, но проект уже начат на Delphi, переписывать готовое - значит, тратить неоплачиваемое время.

Можно переписать код С++ на Delphi. Для этого требуется время, и, возможно, немалое, а главное - знание С++ на уровне существенно выше начального ("читаю со словарем"). При этом, многие языковые конструкции С++ не имеют прямых аналогов в Delphi, и их перенос чреват появлением ошибок, в том числе, совершенно дурацких, и потому трудноотлавливаемых. В частности, прекрасный пример из обсуждения статьи "ЯП, ОПП и т.д. и т.п. в свете безопасности программирования":

for(;P('\n'),R-;P('/')) for(e=C;e-;P('_'+(*u++/8)%2))P('/ '+(*u/4)%2);  

Можно попробовать засечь время и перевести это на Pascal. Станет примерно понятно, сколько времени уйдет на перевод класса, где подобные конструкции не единичны.

Можно воспользоваться интерфейсами и технологией СОМ (пожалуй, точнее - моделью СОМ и технологией ActiveX). Но - вот цитата из [1], глава " Модель многокомпонентных объектов":
"И еще одно замечание: не думайте, что путь будет легким. Крейг Брокшмидт говорил, что перед тем, как он начал понимать эти концепции, у него был " шесть месяцев туман в голове." Минимальная предпосылка - исчерпывающее знание языка С++." Конец цитаты. И, хотя "модель СОМ предоставляет унифицированный, открытый, объектно-ориентированный протокол связи между программами " (цитата оттуда же), она требует такой квалификации от программиста, которая редко встречается в среде непрофессионалов.

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

С учетом того, что в группе разработчиков в основном о С++ поверхностные представления, а СОМ - незнакомая аббревиатура, и, при этом, срок сдачи проекта - традиционно - вчера, ничего лучше варианта с DLL у нас придумать не получилось.