COM 接口声明和使用(或缺少)
COM interface declaration and use (or lack thereof)
据我了解,COM 接口在 C++ 中是抽象的 类,但出于某种原因转换为 C# 接口。为什么必须在 C# 中声明接口的所有方法,即使不打算使用其任何成员?以 IFileOperation 为例,我尝试删除我已验证的函数声明,这些声明从未在我的代码中调用过,但它导致 System.AccessViolationException 被抛出。
您的代码没有 运行 孤立。 COM 接口是提供服务的代码与使用这些服务的代码之间的二进制契约。该合约是一个全有或全无的协议(需要注意的是 E_NOTIMPL 可用于指示某些可选方法不可用,如果接口文档表明这是允许的).
IFileOperation
不是您的合同。它属于微软。它用于与 Microsoft 代码和其他第 3 方代码进行交互。该代码(您不拥有)期望 类 实现接口为接口中的每个方法提供函数指针(并将其放入 VTable 中)。这就是界面的意思。您不必不提供该函数指针。根据接口的记录规则,该代码 将调用 它认为适合调用的接口中的任何方法。这不是你的选择。
如果您完全确定没有调用该方法,则表示您没有使用它与 shell 进行交互。如果您不喜欢某些方法并且不与 shell(或其他第 3 方代码)交互,您可以随时构建自己的界面;没有人强迫你借别人的。确保 COM 服务器和客户端都同意接口定义。
另一方面,如果您正在与 shell 交互,您不知道 shell 会调用您的哪些方法。您必须为所有这些提供实现,即使您所做的只是 return 一个错误。我对 IFileOperation
不是很熟悉,所以请仔细阅读文档。某些方法可能会 return 特定的错误消息(如 E_NOTIMPL)以指示特定功能不可用。
您遇到无效的访问冲突这一事实强烈表明确实正在调用您不喜欢的方法之一。
据我了解,COM 接口在 C++ 中是抽象的 类,但出于某种原因转换为 C# 接口。为什么必须在 C# 中声明接口的所有方法,即使不打算使用其任何成员?以 IFileOperation 为例,我尝试删除我已验证的函数声明,这些声明从未在我的代码中调用过,但它导致 System.AccessViolationException 被抛出。
您的代码没有 运行 孤立。 COM 接口是提供服务的代码与使用这些服务的代码之间的二进制契约。该合约是一个全有或全无的协议(需要注意的是 E_NOTIMPL 可用于指示某些可选方法不可用,如果接口文档表明这是允许的).
IFileOperation
不是您的合同。它属于微软。它用于与 Microsoft 代码和其他第 3 方代码进行交互。该代码(您不拥有)期望 类 实现接口为接口中的每个方法提供函数指针(并将其放入 VTable 中)。这就是界面的意思。您不必不提供该函数指针。根据接口的记录规则,该代码 将调用 它认为适合调用的接口中的任何方法。这不是你的选择。
如果您完全确定没有调用该方法,则表示您没有使用它与 shell 进行交互。如果您不喜欢某些方法并且不与 shell(或其他第 3 方代码)交互,您可以随时构建自己的界面;没有人强迫你借别人的。确保 COM 服务器和客户端都同意接口定义。
另一方面,如果您正在与 shell 交互,您不知道 shell 会调用您的哪些方法。您必须为所有这些提供实现,即使您所做的只是 return 一个错误。我对 IFileOperation
不是很熟悉,所以请仔细阅读文档。某些方法可能会 return 特定的错误消息(如 E_NOTIMPL)以指示特定功能不可用。
您遇到无效的访问冲突这一事实强烈表明确实正在调用您不喜欢的方法之一。