Используя ATL (VS2008), как я могу перечислить доступные методы, доступные в данном интерфейсе IDispatch (IDispatch*
)? Я должен искать метод с собственным именем и, как только я имею DISPID
, призовите метод (я знаю параметры, которые берет метод.) Идеально я хотел бы сделать этот использующие умные указатели COM (CComPtr<>
).
Действительно ли это возможно?
Вы не можете перечислить все доступные методы, если объект не реализует 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 для списка методов, но я не сделал Это. Смотрите другой ответ.
Вы можете перечислить методы IDispatch
с помощью информации о типе. Есть два способа получить информацию о типе:
IDispatch :: GetTypeinfo
. К сожалению, реализация IDispatch
не обязана предоставлять информацию о типе о методах и свойствах, которые он реализует.
Если оно это делает, однако, основной перечисление включает в себя вызов itypeinfo :: getTypeattr
, чтобы получить Typeattr
для интерфейса и глядя на количество реализованных методов ( CFUNC
) и переменные ( CVARS
) и петли по этим и вызов Itypeinfo :: getFuncdesc ()
или Itypeinfo :: getVardesc ()
. Конечно, есть гораздо больше деталей, с которыми вам придется иметь дело, как я могу перечислить здесь, но это должно быть хорошей отправной точкой для вашей разведки.
Вот приятное статья, объясняющая процесс более подробно с кодом в VB.NET.