2 个 COM 对象,并在另一个对象中使用其中一个对象的接口
2 COM objects and using interface from one of it in another
我有以下设置:
C# 应用和两个 COM 对象(人脸和处理器(,用 C++ 编写。
第一个 COM 对象公开接口 IFace。它在其 IDL 文件中进行了描述。
第二个 COM 对象具有接口 IProcessor,公开方法 ProcessFace(IFace* face(。
C# 应用应使用第一个 COM 对象来获取人脸,第二个对象来处理它。 这里的问题是 - 为第二个对象编写 IDL 文件的正确方法是什么,以便它可以从第一个 COM 使用接口类型的参数。
我应该以某种方式将face.idl包含在processor.idl中,还是只是将此参数保留为void*,然后在ProcessFace实现中将其转换为IFace*?
第二个COM对象应该包含第一个COM对象中的一些.h文件(用于接口共享(,但这是唯一应该包含的内容,我是否正确?
您可以使用 idl 导入指令。Windows SDK .idl文件充满了这些(如import "unknwn.idl";
(。因此,在processor.idl
:
import "face.idl";
[
object,
uuid(6E0537CC-232A-4E73-A625-358591CA9231),
pointer_default(unique)
]
interface IProcessor
{
HRESULT ProcessFace(IFace *pFace);
};
当然,这将需要 .idl 文件(以及生成的 .h 和各种工件,如果有的话,用于编译阶段(存在于可访问的目录中。
这里有两个选择 -import
或importlib
。
遗憾的是,import
会导致导入文件中的接口和 coclass 定义存在于已编译的.tlb
文件中。这会导致注册和代理时出现各种问题。我不建议使用import
.
importlib
没有同样的问题。但是,这意味着您必须先将.idl
编译为.tlb
,然后才能导入它。从包含依赖项 (IFace
( 的.idl
编译.tlb
。然后使用importlib
关键字从包含依赖 (IProcessor
( 的.idl
中引用该类型库。您的第二个.idl
文件将如下所示:
[...]
library ProcessorLibrary
{
importlib("FaceLibrary.tlb");
[...]
interface IProcessor
{
HRESULT ProcessFace(FaceLibrary.IFace* face)
};
}
对于importlib
参数,可以使用完全限定路径或相对路径。如果使用相对路径,它将尝试使用PATH
环境变量解析此文件名。如果您为此使用 Visual Studio,则可以在项目属性中设置搜索路径 - 在VC++ Directories
下,将搜索路径放入Executable Directories
变量中。这对应于.vcxproj
文件中的ExecutablePath
属性。
请注意,importlib
和界面中的"FaceLibrary
"是不同的。importlib
中的那个是.tlb
文件的名称。接口中使用的标识符是类型库名称(与第一个.idl
文件中的library
键一起使用的名称(。
为了编译第二个.idl
文件的生成C++,您必须做两件事。第一个.tlb
需要手动#import
到第二个C++项目中,就像您必须在第二个.idl
中使用importlib
一样。然后,您需要处理C++命名空间问题。遗憾的是,midl.exe
不会生成使用命名空间的代码。虽然第二个.idl
文件包含FaceLibrary.IFace
,但生成的C++只包含IFace
。这意味着您需要不使用命名空间将第一个.tlb
导入到C++项目中,或者必须使用 typedef。
不使用命名空间:
#import "FaceLibrary.tlb" no_namespace
#include "Processor_i.h"
使用命名空间:
#import "FaceLibrary.tlb"
typedef FaceLibrary.IFace IFace;
#include "Processor_i.h"
#import
中相对路径的解析方式与importlib
中的工作方式相同。
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 2 个 COM 对象,并在另一个对象中使用其中一个对象的接口
- 如果一个COM接口的指针分配给一个CComPtr对象,我需要释放原来的一个