gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:21 28 4
gpt4 key购买 nike

我正在编写一个 ATL 项目,我想知道我应该如何在这里创建类。现在我有一个类是由 Add/Class/ATL Simple Object 创建的。我想将它分成更小的类,但此类中的方法应该使用 CComPtr 并将 CComPtr 作为参数。我无法创建“简单”的 C++ 类,因为那里没有 CComPtr

我是否应该通过 ATL 简单对象向导 创建 ATL 类,然后使用该类的接口(interface)来调用方法。喜欢这里:

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

我应该通过 Class View/ITestAtlClass/Add/Add Method 添加所有公共(public)方法吗?构造函数呢?我是否必须仅通过属性初始化我的类(并通过 Class View/ITestAtlClass/Add/Add Property 添加它们)?并通过 IUnknown 接口(interface)传递每个 com 对象?

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

最佳答案

我不明白你说你不能使用 CComPtr 的评论来自一个简单的 C++ 类。你能解释一下吗?

我看到两种策略:

  • 构建一个干净的 C++ 对象模型来解决问题,然后将其包装在一个或多个 COM 对象的薄外观层中
  • 始终使用 ATL 类,并使用 CComObject<>和衍生物来实例化和维护它们而无需 CoCreateInstance 的开销以及仅使用公共(public)接口(interface)的局限性。

第一个通常要好得多,但如果您要构建数据密集型对象模型,则第二个可能是一种有用的技术。

如果您有一个名为 CVehicle 的 ATL COM 类, 源自 CComObjectRootEx<>和 friend 们,你可以像这样实例化它;

   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 的评论的意思,也许我可以对此进行扩展。

关于c++ - 我应该如何在 ATL 项目中创建类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4366442/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com