1

我正在从 activeX 控件中拖放。在拖动时,我提供了一个 CComQIPtr,它实现了将信息传递到放置目标的 COM 方法。放置时,放置目标的进程调用我的 COM 方法来获取信息。

我是否不允许在该接口边界附近使用 CRT 类型或指向 CRT 类型的指针?我希望我的 IDataObject 有一个私有的 std::list 和一些 std::strings,并且在接口的外部可以调用可以访问这些私有成员的 COM 方法。

我认为这没关系,因为我实际上并没有跨边界传递CRT 类型。

MSDN:跨 DLL 边界传递 CRT 对象的潜在错误

4

1 回答 1

2

您可以在 com 对象的实现中使用您喜欢的任何东西,因为它始终保留在创建它的进程(或 dll)中。

您需要在 COM 接口中坚持使用 COM 类型,以便可以在使用对象的进程和创建对象的进程之间编组这些类型。

你是对的。那篇文章不适用于这种情况,因为您没有越过边界传递任何东西。COM 基础结构为您处理跨边界编组 COM 类型。

只要确保在 COM 方法中捕获所有异常,就不能让它们从函数中泄漏出来,因为 COM 基础结构不知道如何处理它们。

就我个人而言,我倾向于使用一层薄薄的 COM 代码来处理 COM 类型和“普通”类型之间的转换,然后调用执行实际工作的代码(参见此处)。该层包括一个异常处理程序,它捕获所有内容并转换为适当的 HRESULT。

于 2010-07-06T15:35:43.090 回答