(Я немного опоздал на этот вопрос, но эта проблема близка и дорога моему сердцу.)
Вы можете попытаться использовать старый способ доступа к COM-объектам из C / C ++. Это включает разработчиков COM-объектов, предоставляющих клиентские файлы .h, которые имеют версии COM-интерфейсов C / C ++. Эти файлы выглядят как более простые версии того, что делает #import.
Откуда эти файлы? Если COM-объекты написаны на C / C ++ (VC ++), то они поступают из компилятора MIDL. Этот инструмент командной строки берет файлы ODL / IDL и создает из них исходный код C / C ++. Часть того, что он излучает, полезна для клиентского приложения.
Если у вас есть источник COM-объектов, возможно, у вас уже есть эти файлы!
Если у вас есть только TLB-файлы, вы можете использовать OLE / COM Object Viewer (OLEVIEW.exe - поставляется как минимум с VC ++ 6.0), вы открываете библиотеку типов и сохраняете как и OLD / IDL файл. Затем запустите компилятор MIDL, чтобы сгенерировать клиентские файлы C / C ++. Существует вероятность того, что сторонний COM-объект может поставляться с этими файлами, но они часто этого не делают (я вспоминаю, что Crystal Reports сделал какое-то время, а затем перестал их отправлять - пофиг на нас - но я отступаю ).
Использование интеллектуальных указателей ATL (и других вспомогательных классов) с интерфейсными классами, которые создает MIDL, почти не отличается от того, что создает #import. Это зависит от того, сколько из # специфичных для импорта функций вы используете.
Для / MP я сделал как то, что я предлагаю, так и кое-что из того, что предлагает принятый ответ Мэтта Дэвисона.