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

Mar*_*ski 5 c++ com dll atl visual-c++

我正在写一个ATL项目,我想知道如何在这里创建类.现在我有一个由Add/Class/ATL Simple Object创建的.我想把它分成更小的类,但这个类的方法应该使用CComPtrCComPtr作为参数.我不能创建'简单'的c ++类,因为我没有CComPtr.

我应该通过ATL简单对象向导创建ATL类,然后使用此类的接口来调用方法.像这儿:

CComPtr<ITestAtlClass> tptr;
tptr.CoCreateInstance(CLSID_TestAtlClass);
tptr->test();
Run Code Online (Sandbox Code Playgroud)

我应该通过Class View/ITestAtlClass/Add/Add方法添加所有公共方法吗?那么施工人员呢?我是否必须仅通过属性初始化我的类(并通过Class View/ITestAtlClass/Add/Add Property添加它们)?并通过IUnknown接口传递每个com对象?

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

Kim*_*man 8

我不明白你的评论,你不能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();
Run Code Online (Sandbox Code Playgroud)

还存在变化CComObject<>,例如CComObjectStack<>使用不同的分配和引用计数策略.

如你所见,这非常混乱.如果你能解释一下你的评论无法使用的意思CComPtr,也许我可以扩展一下.