没有代理/存根DLL的进程外COM服务器?

4
我正在学习如何实现一个进程外的COM服务器,看到了这篇Code Project文章:“构建本地COM服务器和客户端:逐步示例”。我可以编译并运行它,但代理/存根DLL在哪里?我只能看到IDL文件,在构建过程中生成代理/存根代码。但是DLL是如何构建的,它在哪里?
2个回答

6
简短的答案是所有接口都标记为"oleautomation",因此oleaut32.dll执行了封送操作,因为COM知道如何封送接口中使用的所有类型。如果缺少"oleautomation",或者指定了COM默认不知道如何封送的类型(在此处查看列表),则需要使用非默认封送程序及其存根。

4
你需要代理/存根项目来帮助COM调度你的接口。当你用Visual Studio创建ATL C++项目时,通常会自动创建一个带有PS后缀的辅助项目,这就是你的代理/存根DLL。但是,你可能完全不需要它(我个人从来没有必须构建和使用它,尽管我确实不得不处理像自定义调度这样的问题)。如果你提供了类型库,它会被注册并满足某些条件——COM将为你提供自动代理/存根对。
额外阅读:

好的,谢谢。我会阅读您提供的链接,并且考虑到代理/存根DLL似乎是可选的,我认为问题已经得到了回答。您能推荐一些关于学习COM的书籍吗?我有Dale Rogerson的《Inside COM》,我认为它在解释进程内服务器方面做得非常好,但是在涉及EXE服务器时变得有些肤浅。 - Dabbler
这并不简单,您仍然需要注册HKCR\Interface\{iid}\ProxyStubClsid32和TypeLib键才能获得使用类型库的标准编组程序。CLSID为{00000320-0000-0000-C000-000000000046}。如果您没有这样做而它仍然有效,则很可能违反了公寓规则,因为没有对接口指针进行编组。 - Hans Passant
@HansPassant:你不需要自己做,它会随着常规类型库注册“免费”提供,前提是接口本身是dual(和/或oleautomation-不确定)。 - Roman R.
不,如果您不添加这些键,COM无法从接口IID中找到类型库。 - Hans Passant
ProxyStubClsid32是自动生成的:https://dev59.com/v0rSa4cB1Zd3GeqPSwOy#1741981 - Roman R.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接