В чем различие между интерфейсом C ++ и COM для IVssExamineWriterMetadata? - PullRequest
0 голосов
/ 19 мая 2019

Согласно https://docs.microsoft.com/en-us/windows/desktop/api/vsbackup/nl-vsbackup-ivssexaminewritermetadata:

Интерфейс IVssExamineWriterMetadata - это интерфейс C ++ (не COM) , который позволяет запрашивающей стороне проверять метаданные конкретного экземпляра модуля записи. Эти метаданные могут поступать от исполняющего в настоящее время (действующего) средства записи или храниться в виде документа XML.

Весь код, который я вижу, обрабатывает его как интерфейс COM.

Для меня определение выглядит как COM.

https://github.com/candera/hobocopy/blob/master/inc/winxp/vsbackup.h#L91

В чем здесь разница? Это нарушает правила проектирования интерфейса COM каким-либо задокументированным способом?

1 Ответ

0 голосов
/ 19 мая 2019

Я думаю, что парень (ы), которые написали этот код, файл и связанный документ, вероятно, не знали, что такое COM, поэтому они внесли свою путаницу.

Например, они используюткомбинация типов аргументов BSTR (Automation) и LPCWSTR (raw) в одном и том же интерфейсе (IVssBackupComponents для примера), что очень странно.

Это COM, необработанный COM, потому что COM по сути очень прост.Вы можете определить COM vtable многими способами, с любым языком, в этом его прелесть (не говоря уже о IDispatch, библиотеках типов, MIDL, потоках, реестре, фабриках классов, вне процесса, маршалинге и т. Д.).

В качестве другого необработанного примера COM, посмотрите на DirectX: Программирование DirectX с помощью COM хорошо написано и говорит о том, что они называют «необработанным COM».

...