COM接口声明和使用(或缺少)

时间:2017-10-18 18:06:26

标签: c# c++ interface com com-interop

据我了解,COM接口是C ++中的抽象类,但由于某种原因转换为C#接口。为什么必须在C#中声明接口的所有方法,即使一个人不打算使用它的任何成员?以IFileOperation为例,我尝试删除我已经验证的函数声明,但我的代码中从未调用它,但它会导致抛出System.AccessViolationException。

1 个答案:

答案 0 :(得分:0)

您的代码不是孤立运行的。 COM接口是提供服务的代码和使用这些服务的代码之间的二进制契约。合同是一个全有或全无的协议(需要注意的是,E_NOTIMPL可用于指示某些可选方法不可用,如果接口文档指示允许这样做)。

IFileOperation不是你的合同。它属于Microsoft。它用于与Microsoft代码和其他第三方代码进行交互。该代码(您不拥有)要求实现接口的类为接口中的每个方法提供一个函数指针(并将其放在VTable中)。这就是界面的意思。你不能不提供那个函数指针。根据记录的接口规则,代码将调用它认为适合调用的接口中的任何方法。这不是你的选择。

如果您完全确定该方法未被调用,则表示您没有使用它与shell进行交互。如果你不喜欢某些方法,并且你不与shell(或其他第三方代码)交互,你可以随时组成自己的界面;没有人强迫你借用别人的。确保COM服务器和客户端都同意接口定义。

另一方面,如果您正在与shell进行交互,则不知道shell将调用哪些方法。您必须为所有这些实现提供实现,即使您所做的只是返回错误。我对IFileOperation并不十分熟悉,所以请仔细阅读文档。某些方法可能会返回特定的错误消息(如E_NOTIMPL),以指示特定功能不可用。

您获得无效访问冲突的事实强烈暗示您不喜欢其中一种方法确实被调用。