Вы не можете перечислить все доступные методы, если объект не реализует IDispatchEx.
Однако, если вы знаете имя метода, который хотите вызвать, вы можете использовать GetIDsOfNames для сопоставления имени с правильным DISPID.
HRESULT hr;
CComPtr<IDispatch> dispatch;
DISPID dispid;
WCHAR *member = "YOUR-FUNCTION-NAME-HERE";
DISPPARAMS* dispparams;
// Get your pointer to the IDispatch interface on the object here. Also setup your params in dispparams.
hr = dispatch->GetIDsOfNames(IID_NULL, &member, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (SUCCEEDED(hr)) {
hr = dispatch->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, dispparams, &varResult, NULL, NULL);
}
Изменить: для полноты, я подозреваю, что есть способ опросить интерфейс ITypeInfo2 (при условии, что для объекта есть библиотека типов), который вы получаете от IDispatch :: GetTypeInfo для списка методов, но я этого не делал. Смотрите другой ответ.
person
i_am_jorf
schedule
21.01.2010