【问题标题】:How should I create classes in ATL project?我应该如何在 ATL 项目中创建类?
【发布时间】:2011-05-20 23:14:22
【问题描述】:

我正在编写一个 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 之外创建这些类)只是为了让我的代码更具可读性。

【问题讨论】:

  • 只为应该在 DLL 外可见的接口创建 ATL 类。
  • @Hans Passant 但我无法创建使用 CComPtr 的简单 c++ 类。怎么用?

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


【解决方案1】:

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

我看到了两种策略:

  • 构建一个干净的 C++ 对象模型来解决问题,然后将其包装在一个或多个 COM 对象的薄外观层中
  • 始终使用 ATL 类,并使用 CComObject&lt;&gt; 和派生类来实例化和维护这些类,而不会产生 CoCreateInstance 的开销以及仅使用公共接口的限制。

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

如果您有一个名为 CVehicle 的 ATL COM 类,它派生自 CComObjectRootEx&lt;&gt; 和朋友,您可以像这样实例化它;

   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&lt;&gt; 也有一些变化,例如CComObjectStack&lt;&gt; 使用不同的分配和引用计数策略。

如您所见,这非常混乱。如果您可以解释您对无法使用CComPtr 的评论是什么意思,也许我可以对此进行扩展。

【讨论】:

  • 非常感谢!!看起来我只是不明白如何使用这些 ATL 类。现在,当您向我展示此示例时,我在 MSDN 上发现了相同的示例。我也可以创建这样的 ATL 类吗?:CComObject&lt;CVehicle&gt; vehicle; vehicle.someMethod() 那我就不用担心释放内存了?或者我可以这样写:CComPtr&lt;CComObject&lt;CVehicle&gt;&gt;; CComObject&lt;CVehicle&gt;::CreateInstance(&amp;vehicle); 它会在不需要时自行释放?
  • 当我说我不能使用 CComPtr 我不知道要创建 ALT 对象时...我尝试将 atlcomcli.hatlcom.h 包含到普通的 c++ 类(没有 ATL 简单对象的情况下创建)向导)。我有点惭愧,但这些 ATL 资源并不好。
  • 为了在堆栈上创建对象,正如您所展示的,您使用CComObjectStack&lt;&gt;。我不确定 CComObjectStack 是否可以作为成员变量嵌入到另一个类中,您可能需要了解其他 CComObject 变体。
  • 不,ATL 一直没有被充分记录。在我找到 ATL Internals 一书后,我再也没有费心跟上 MSDN 了——它非常详细地介绍了这些东西:amazon.com/dp/0321159624
  • CComPtr 在 atlcomcli.h 中,虽然它可能默认在命名空间 ATL 中,因此您可能需要使用 ATL::CComPtr 来获取它。通常您在预编译头文件 (stdafx.h) 中包含 ATL,因此它可用于项目中的所有头文件和 .cpp 文件。也许命名空间限定是什么让你绊倒?
猜你喜欢
  • 2016-06-09
  • 1970-01-01
  • 2011-03-29
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2011-02-12
  • 2020-02-03
相关资源
最近更新 更多