每个新的COM类都必须重新实现IUnknown接口吗?

6
抱歉,如果这个问题对每个人来说都很明显,但我对COM非常陌生。从这里的教程http://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567中看到,似乎每个在C++中创建的COM类必须实现自己的QueryInterface、AddRef和Release。由于这些方法对于任何新类来说基本上应该具有相同的实现,我不明白为什么没有一些抽象类或其他东西可以为开发者实现它。我不明白为什么我要重新实现那么多人已经反复实现过的相同内容(除非教程是错误的,确实有某些东西)。谢谢。
3个回答

3

FTA:

"我相信每个想要理解COM基本原理的程序员,都必须使用纯C++编写至少一个简单的COM对象,即不使用MFC/ATL提供的模板和宏。"

回答您的问题:是的,每个COM组件都必须实现IUnknown接口,这是COM构建的基础。但是,对于创建COM对象的“标准管道”,可以使用ATL项目向导来完成。


这个向导程序非常无用。当我尝试使用它时,它告诉我它要为我的项目添加ATL支持,然后我得到了一个致命错误RC1015:无法打开包括文件"MyResource.h"。虽然我的项目编译正常,但MyResource.h文件存在并且位于包括路径中。 - Carl
但无论如何,您回答了这个问题,我忘记了我在教程开始时读到过这个问题,对于愚蠢的问题感到抱歉。 - Carl
@Carl 不是一个愚蠢的问题,地球上每个人都有“咦”时刻(我发现在使用COM时这些时刻呈指数增长)。祝你的项目好运。 - Brandon Moretz
@Carl:你可以通过编辑资源编译器设置来解决RC1015错误 - 它们位于“配置”->“资源”->“常规”,你需要更改包含路径。 - sharptooth
@sharptooth:是的,我已经这样做了,如果不这样做,我的项目就无法编译。但是当我运行向导时,它会给我一个RC1015错误,然后我检查项目设置,发现我的资源包含路径被删除了。所以我重新写了它们,但每次运行向导时它们都会被删除,不知道为什么 -_-... - Carl

2

如果您不想使用ATL或其他辅助库,可以使用QISearch帮助函数来处理QueryInterface。AddRef和Release可以在您自己的基类中实现。

COM还需要与纯C一起使用,因此Windows SDK实际上并没有超出类及其方法的定义。


1

是的,每个COM类都必须实现IUnknown,因为每个COM类都继承自IUnknown - 这是基本的COM技术原则之一。通常使用ATL来完成这个过程 - 它有模板和宏可以轻松地完成这个过程,即使您不想使用ATL,也可以很容易地编写一个模板来处理大多数简单情况(如实现一个接口)并重复使用。


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