Если вы работаете с COM и автоматизацией в C/C++ (или старые версии Delphi), вы должны использовать разновидности параметров, которые вы хотите сделать необязательным. Кроме того, необязательные аргументы, определенные в стиле C++, не поддерживаются для COM.
Это означает, что для тех VARIANT, которые вы должны предоставить при вызове другого объекта, и вы хотите указать необязательные параметры (например, при разговоре с MS Word или Excel через Automation), вам нужно будет инициализировать эти ВАРИАНТЫ с помощью тип VT_ERROR и поле scode, установленное на DISP_E_PARAMNOTFOUND.
При приеме вызовов с других объектов, которые могут упускать параметры (VBScript, JScript), вам необходимо проверить все свои VARIANT для случаев, когда тип был установлен в VT_ERROR, а поле scode - DISP_E_PARAMNOTFOUND.
Эквивалент .NET - использовать объект, установленный для Type.Missing для тех параметров, которые были отображены на COM-параметры. Следующая ссылка может быть полезна для просмотра обеих сторон истории.
.NET4Office : Type.Missing, C#, and Word (MSDN Blog)
Все это коренится в том, как более старые версии VB (6 и предыдущий) обрабатываются необязательные аргументы. Вот ссылка KB MS Support, которая довольно кратка.
How to pass optional parameters when you call a function from C++ (kb238981)
Чтобы решить ваши другие вопросы, неверно полагать, что большинство объектов COM написано на C++, так как COM строго об объявлении интерфейсов и макетов интерфейсов в хорошо известном способе. Не имеет значения, какой язык или инструменты используются для создания COM-объектов, пока они наблюдают и подчиняются макетам поддерживаемых интерфейсов.
Наконец, вы правы в том, что COM является методологией - не совсем в смысле настройки архитектуры для любого конкретного приложения, а в том, чтобы дать возможность четко определить взаимосвязанные компоненты, которые могут составлять приложение или могут быть доступны к другим приложениям.