【发布时间】:2019-09-17 10:55:54
【问题描述】:
我想了解本文中提到的文件的用途,并将知识链接到我当前的COM服务器和COM客户端场景,以便我可以实现我的COM服务器使用COM服务器:this
我有一个 COM 服务器,它是一个在后台运行的 exe 或服务。现在,我知道有一个继承自 IUnknown 和 IDispatch 的公开接口。此外,我还生成了以下文件:
xxx_i.c 定义了所有的 CLSID 和 IID
xxx_i.h 定义了接口支持的所有方法
xxx_p.c ?
dlldata.c ?
我现在使用自动化方式 IDispatch -> Invoke() 来访问接口方法。虽然这种方式在不使用上述任何文件的情况下似乎可以正常工作,但我仍然想了解它们的用途,同时使用常规方式 IUnknown -> QueryInterface() 来访问这些方法。
由于我是 COM 世界的新手,任何建议阅读都将不胜感激!谢谢!
【问题讨论】:
-
@HansPassant 谢谢!由于我没有足够的声誉来评论该帖子,因此我需要您的建议。根据那篇文章,似乎 include _i.h 只需要自己处理“编组”,但 include .tlb 不需要。我的解释正确吗?
-
类型库是为使用服务器的程序员准备的。创建服务器时,您将使用 .h 文件。编组是代理/存根的工作,它是由两个 .c 文件构建的。明智的做法是使用 Visual-C++ 中的 ATL 项目模板以及类向导,所有这些东西都会自动整理出来。
-
@HansPassant 1. .h文件不是MIDL编译器生成的吗? “创建服务器”是什么意思? 2.如果我使用tlb,我必须先为客户端生成代理/存根吗?如果是这样,为什么我在客户端上使用 .h 文件仍然有效?
-
1.是的。 “COM 服务器和 COM 客户端”,即服务器。 2. 如果接口足够简单并且您正在处理所需的注册表项,则客户端可以使用 tlb 进行编组,但效率不高。如果它是用 C++ 编写的,则只能在客户端中使用 .h 文件,类型库几乎可以被任何语言使用。即使您使用 C++ 作为客户端,您仍然倾向于使用#import,自动生成的包装器非常好。
标签: c++ com msdn idispatch iunknown