Я не понимаю ваш комментарий о том, что вы не можете использовать CComPtr
из простого класса C ++.Не могли бы вы уточнить?
Я вижу две стратегии:
- построить чистую объектную модель C ++, которая решает проблему, а затем обернуть ее в тонкий фасадный слой из одного или нескольких COMобъекты
- Повсеместно используйте классы ATL и используйте
CComObject<>
и производные для их создания и обслуживания без издержек CoCreateInstance
и ограничений только на использование открытых интерфейсов.
Первый обычно намного приятнее, но если вы строите объектную модель с большими объемами данных, вторая может быть полезной техникой.
Если у вас есть ATL COMкласс под названием CVehicle
, производный от CComObjectRootEx<>
и друзей, вы можете создать его так:
CComObject<CVehicle>* vehicle = NULL;
CComObject<CVehicle>::CreateInstance(&vehicle);
vehicle->AddRef();
// To get at any of its interfaces, use:
CComPtr<ICar> car = 0;
vehicle->QueryInterface(&car);
// And to delete object, use:
vehicle->Release();
Также есть варианты CComObject<>
, например, CComObjectStack<>
, которые используют различное распределение и подсчет ссылокстратегии.
Как видите, это довольно грязно.Если вы можете объяснить, что вы подразумеваете под своим комментарием о невозможности использования CComPtr
, возможно, я смогу расширить это.