У меня есть оболочка MFC над COM-объектом. Есть функция, которая принимает большое количество опций, которые в большинстве своем являются необязательными. Как передать одни аргументы, а другие - нет?
Как бы то ни было, необязательные аргументы указаны как VARIANT *.
Ниже приведен код
CComVariant vFalse = false;
CApplication application;
{
application.CreateDispatch(_T("Word.Application"));
CDocuments documents = application.get_Documents();
CComVariant vFilename = _T("c:\\temp\\test.rtf");
CComVariant vNothing;
CComVariant vEmpty = _T("");
CComVariant vOpenFormat = 0;
application.put_Visible(TRUE);
//
// THIS FUNCTION has a number of optional arguments
//
LPDISPATCH pDocument = documents.Open(&vFilename, &vFalse, &vFalse, &vFalse, &vEmpty, &vEmpty, &vFalse, &vEmpty, &vEmpty, &vOpenFormat, &vOpenFormat, &vFalse, &vFalse, &vOpenFormat, &vFalse, &vFalse);
}
application.Quit(&vFalse, NULL, NULL);





Неуказанный вариант обычно VT_EMPTY:
_variant_t vtEmpty(VT_EMPTY);
Очевидно, вы написали оболочки CDocuments и CApplication для интерфейсов COM, поэтому вы можете указать дополнительные параметры как имеющие значение по умолчанию vtEmpty.
Чтобы пропустить необязательный параметр в методе COM, передайте VARIANT типа VT_ERROR, а код ошибки должен быть DISP_E_PARAMNOTFOUND.
CComVariant vtOptional;
vtOptional.vt = VT_ERROR;
vtOptional.scode = DISP_E_PARAMNOTFOUND;
Теперь вы можете использовать vtOptional в качестве параметра, который не нужно указывать, если параметр является необязательным.
Вот официальное слово по этому поводу: «Как передать необязательные параметры при вызове функции в Visual C++»