IVssExamineWriterMetadata 的 C++ 和 COM 接口有什么区别?
What is distinction between a C++ and COM interface for IVssExamineWriterMetadata?
根据https://docs.microsoft.com/en-us/windows/desktop/api/vsbackup/nl-vsbackup-ivssexaminewritermetadata:
The IVssExamineWriterMetadata interface is a C++ (not COM) interface that allows a requester to examine the metadata of a specific writer instance. This metadata may come from a currently executing (live) writer, or it may have been stored as an XML document.
我看到的所有代码都将其视为 COM 接口。
- https://github.com/Microsoft/Windows-classic-samples/blob/master/Samples/VShadowVolumeShadowCopy/cpp/writer.cpp#L108
- https://github.com/GoogleCloudPlatform/compute-image-windows/blob/master/third_party/vss/GoogleVssAgent/writer.cpp#L48
在我看来,定义类似于 COM。
https://github.com/candera/hobocopy/blob/master/inc/winxp/vsbackup.h#L91
这里有什么区别?它是否以某种记录的方式违反了 COM 接口设计规则?
我的猜测是编写此代码、文件和相关文档的人可能不知道 COM 是什么,所以他们带来了自己的困惑。
例如,他们在同一接口(例如 IVssBackupComponents)中使用 BSTR(自动化)和 LPCWSTR(原始)参数类型的组合,这很奇怪。
这是 COM,原始 COM,因为 COM 本质上非常简单。您可以使用任何语言以多种方式定义 COM vtable,这就是它的美妙之处(更不用说 IDispatch、类型库、MIDL、线程、注册表、class 工厂、out-of-process、封送处理、等)。
对于另一个原始 COM 示例,请查看 DirectX:Programming DirectX with COM 写得很好并且谈论他们所说的 "raw COM" 是什么。
根据https://docs.microsoft.com/en-us/windows/desktop/api/vsbackup/nl-vsbackup-ivssexaminewritermetadata:
The IVssExamineWriterMetadata interface is a C++ (not COM) interface that allows a requester to examine the metadata of a specific writer instance. This metadata may come from a currently executing (live) writer, or it may have been stored as an XML document.
我看到的所有代码都将其视为 COM 接口。
- https://github.com/Microsoft/Windows-classic-samples/blob/master/Samples/VShadowVolumeShadowCopy/cpp/writer.cpp#L108
- https://github.com/GoogleCloudPlatform/compute-image-windows/blob/master/third_party/vss/GoogleVssAgent/writer.cpp#L48
在我看来,定义类似于 COM。
https://github.com/candera/hobocopy/blob/master/inc/winxp/vsbackup.h#L91
这里有什么区别?它是否以某种记录的方式违反了 COM 接口设计规则?
我的猜测是编写此代码、文件和相关文档的人可能不知道 COM 是什么,所以他们带来了自己的困惑。
例如,他们在同一接口(例如 IVssBackupComponents)中使用 BSTR(自动化)和 LPCWSTR(原始)参数类型的组合,这很奇怪。
这是 COM,原始 COM,因为 COM 本质上非常简单。您可以使用任何语言以多种方式定义 COM vtable,这就是它的美妙之处(更不用说 IDispatch、类型库、MIDL、线程、注册表、class 工厂、out-of-process、封送处理、等)。
对于另一个原始 COM 示例,请查看 DirectX:Programming DirectX with COM 写得很好并且谈论他们所说的 "raw COM" 是什么。