我正在编写一个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之外创建这个类)只是为了让我的代码更具可读性。
答案 0 :(得分:8)
我不明白你的评论,你不能在简单的C ++类中使用CComPtr
。你能澄清一下吗?
我看到两种策略:
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
的评论意味着什么,也许我可以扩展它。