2012-06-02 5 views
0

Я работаю над довольно большим проектом, написанным в основном на C++ с использованием MFC. Нам поручено постепенно переносить это приложение на использование Qt. Несколько лет назад оболочка вокруг большей части нашей функциональности была написана с использованием COM. Я чувствую, что использование COM-оболочки из нового Qt-кода поможет изолировать код, который будет зависеть от MFC. К сожалению, нас также попросили использовать наш COM/ActiveX. Итак, введение новых потребителей нашей COM-оболочки в Qt не является идеальным. В Visual Studio есть мастер классов, который будет генерировать класс C++ на основе интерфейса в файле TLB, но он зависит от MFC, и интерфейс по-прежнему предоставляет COM (LPDISPATCH, SAFEARRAY* и т. Д.).Скомпилировать/перевести Microsoft COM IDL на Idiomatic C++?

С учетом всего сказанного, кто-нибудь знает инструмент (бесплатный или коммерческий), который возьмет файл IDL Microsoft и преобразует его в C++, кто интерфейсы не зависят от MFC или COM?

+1

Вещи, которые вы не должны делать, часть 1: http://www.joelonsoftware.com/articles/fog0000000069.html –

+0

И нет, общепринятые стандарты двоичного интерфейса не растут деревья. Qt работает очень хорошо, но это, безусловно, не универсально. –

+0

Я не собираюсь выбрасывать код. Я хочу повторно использовать его, но не добавляйте прямую зависимость от «старой» технологии в новых реализациях. Я также не заинтересован в двоичной совместимости, я просто хочу, чтобы сборник заголовков с библиотекой-оберткой связывался с ним вместо импорта TLB и напрямую обрабатывал COM-интерфейсы. –

ответ

1

и работа с кодом, созданным midl.exe

Это болт-номер номер один. Midl.exe делает не генерировать код, он только генерирует объявления. Чистые виртуальные классы в C++, только объявления методов с no реализации. Либо в файл .h, либо в файл библиотеки типа .tlb. Библиотека типов удобна, поскольку ее легко читать с помощью инструментария, имеющего ограниченный подмножество COM под названием Automation. И реализовано практически во всех языковых версиях Windows.

Ключевым моментом является то, что это только декларации, клей, который делает код, написанный в разных модулях и/или разных языках или библиотеках классов, работает вместе. Очень важно в больших проектах, интерфейсы связывают части вместе.

Наш системный архитектор узнал о нашем подходе и сообщил, что мы находим способ не добавлять эти COM-специфики в наши новые проекты Qt.

Это исключительный бесполезный совет. «Не делай этого» - это то, что мой врач говорит мне, когда мне больно засунуть руку за спину. Я могу жить с этим, у меня есть хорошая альтернатива и могу просто развернуться. В вашем случае я должен был бы потребовать от архитектора еще. Он возится с частями тела, он отделяет туловище от ног, головы, ног и рук. Мозг совершенно разрознен. Самый клей, который делает разные куски кода, которые вы сейчас используете, работает вместе. Разрыв этого интерфейса, и вы серьезно повредите свое приложение, стиль Netscape.

Остерегайтесь архитектора-астронавта (еще одного любителя Спольского), который рад заставить вас во что-то, что он понимает, но не нуждается в реализации. Спросите разумную альтернативу, подход архитектуры, так как разрыв интерфейсов имеет глубокое архитектурное влияние на ваше приложение.Те классы MFC, которые все внедрили из интерфейсов, в значительной степени нежелательны при изменении интерфейса. Переписывание их всех в классы Q будет серьезно держать вас непродуктивными на некоторое время. И это разрушительно скучный код для написания. Только производить то же самое, с большим количеством ошибок. Вещи, которые вы не должны делать, часть 2.

+0

Спасибо за ссылку на астронавт-архитектор, звучит очень знакомо! Тем не менее, я по-прежнему чувствую, что вы считаете, что эта идея является либо пустой тратой времени, либо вообще бессмысленной. Я просто ищу, чтобы изолировать COM-специфический код во внутренних элементах одной библиотеки-обертки. Это означает, что я хочу взять '_com_ptr_t ' и обернуть его в обычный класс C++. Вместо того, чтобы возвращать '_bstr_t', я хочу, чтобы оболочка возвращала либо' wchar_t * ', либо' std :: wstring', поэтому он должен делать это преобразование внутренне. Неужели это все так плохо? Мастер VS делает это, но создает код на основе MFC. –

+1

Ну, похоже, пустая трата дыхания, но почему бы вам просто не пахать вперед? У вас уже есть объявления C++, вы найдете их в файлах .tlh, сгенерированных директивой #import. Просто переименуйте их в .h, перепишите их так, как вы хотите, выбросите файлы .idl и исправьте все автоматически сгенерированный код. –

+0

Я разговаривал с коллегой, и он предложил такой же подход, но мне нужно было «второе мнение». Я верю вашей репутации 257k и считаю это тем мнением, которое я искал. Спасибо за понимание. –

0

Если вы можете продолжать использовать Visual C++, решением будет использовать поддержку простого компилятора для COM.

Вы должны #import подать ваш TLB

http://msdn.microsoft.com/en-us/library/8etzzkb6%28v=vs.100%29.aspx

Затем вы можете использовать поддержку COM компилятора для обработки экземпляров COM объектов,

http://msdn.microsoft.com/en-us/library/h31ekh7e.aspx