我应该如何在ATL项目中创建类?

时间:2010-12-06 12:37:03

标签: c++ visual-c++ dll com atl

我正在编写一个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 添加它们)?并通过IUnknown接口传递每个com对象?

有人可以告诉我在ATL项目中应该怎么做。我将在内部使用这个较小的类(没有人会在我的DLL之外创建这个类)只是为了让我的代码更具可读性。

1 个答案:

答案 0 :(得分:8)

我不明白你的评论,你不能在简单的C ++类中使用CComPtr。你能澄清一下吗?

我看到两种策略:

  • 构建一个解决问题的干净C ++对象模型,然后将其包装在一个或多个COM对象的薄外观层中
  • 在整个过程中使用ATL类,并使用CComObject<>和派生类来实例化和维护这些类,而不需要CoCreateInstance的开销和仅使用公共接口的限制。

第一个通常更好,但如果你正在构建一个数据量很大的对象模型,那么第二个可能是一个有用的技术。

如果您有一个名为CVehicle的ATL COM类,它派生自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的评论意味着什么,也许我可以扩展它。