Как мне создавать классы в проекте ATL? - PullRequest
5 голосов
/ 06 декабря 2010

Я пишу проект ATL, и мне интересно, как мне создавать здесь классы. Прямо сейчас у меня есть один класс, созданный Add / Class / ATL Simple Object . Я хочу разделить его на более мелкие классы, но метод из этих классов должен использовать CComPtr и иметь CComPtr в качестве аргумента. Я не могу создать «простой» класс C ++, потому что у меня там нет CComPtr.

Должен ли я создавать классы ATL с помощью Мастер простых объектов ATL , а затем использовать интерфейс для этого класса для вызова методов. Как здесь:

CComPtr<ITestAtlClass> tptr;
tptr.CoCreateInstance(CLSID_TestAtlClass);
tptr->test();

И я должен добавить все открытые методы с помощью Class View / ITestAtlClass / Add / Add Method ? А как насчет конструкторов? Должен ли я инициализировать свой класс только по свойствам (и добавить их Class View / ITestAtlClass / Add / Add Property )? И передать каждый com-объект через интерфейс IUnknown?

Может кто-нибудь сказать мне, как это должно быть сделано в проекте ATL. Я буду использовать эти меньшие классы внутренне (никто не будет создавать эти классы вне моей DLL) просто для того, чтобы сделать мой код более читабельным.

1 Ответ

8 голосов
/ 07 декабря 2010

Я не понимаю ваш комментарий о том, что вы не можете использовать 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, возможно, я смогу расширить это.

...