我正在拖/放 activeX 控件。在拖动时,我提供了一个 CComQIPtr,它实现了 COM 方法以将信息传递给放置目标。在放置时,放置目标的进程调用我的 COM 方法来获取信息。
我是否不允许在该接口(interface)边界附近使用 CRT 类型或指向 CRT 类型的指针?我希望我的 IDataObject 有一个私有(private)的 std::list 和一些 std::strings,并且在接口(interface)的外部能够调用我的 COM 方法来访问那些私有(private)成员。
我认为这没问题,因为我实际上并没有越过边界传递 CRT 类型。
MSDN: Potential Errors Passing CRT Objects Across DLL Boundaries
最佳答案
您可以在 com 对象的实现中使用任何您喜欢的东西,因为它始终保留在创建它的进程(或 dll)中。
您需要坚持 COM 接口(interface)中的 COM 类型,以便可以在使用对象的进程和创建对象的进程之间对类型进行编码。
你是对的。该文章不适用于这种情况,因为您没有越过边界传递任何东西。 COM 基础结构负责为您跨越边界编码 COM 类型。
只要确保您捕获了 COM 方法中的所有异常,就不能让它们从函数中泄漏出来,因为 COM 基础结构不知道如何处理它们。
就我个人而言,我倾向于使用一个薄薄的 COM 代码层来处理 COM 类型和“普通”类型之间的转换,然后调用执行实际工作的代码(请参阅 here)。该层包括一个异常处理程序,它捕获所有内容并转换为适当的 HRESULT。
关于windows - 跨进程边界的 CRT 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187640/