Перечислить объект COM (IDispatch) методы, используя ATL?

Используя ATL (VS2008), как я могу перечислить доступные методы, доступные в данном интерфейсе IDispatch (IDispatch*)? Я должен искать метод с собственным именем и, как только я имею DISPID, призовите метод (я знаю параметры, которые берет метод.) Идеально я хотел бы сделать этот использующие умные указатели COM (CComPtr<>).

Действительно ли это возможно?

8
задан Rob 21 January 2010 в 09:43
поделиться

2 ответа

Вы не можете перечислить все доступные методы, если объект не реализует 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 для списка методов, но я не сделал Это. Смотрите другой ответ.

8
ответ дан 3 November 2019 в 12:33
поделиться

Вы можете перечислить методы IDispatch с помощью информации о типе. Есть два способа получить информацию о типе:

  • через библиотеку типа (если есть) для DispiNterface.
  • через вызов IDispatch :: GetTypeinfo .

К сожалению, реализация IDispatch не обязана предоставлять информацию о типе о методах и свойствах, которые он реализует.

Если оно это делает, однако, основной перечисление включает в себя вызов itypeinfo :: getTypeattr , чтобы получить Typeattr для интерфейса и глядя на количество реализованных методов ( CFUNC ) и переменные ( CVARS ) и петли по этим и вызов Itypeinfo :: getFuncdesc () или Itypeinfo :: getVardesc () . Конечно, есть гораздо больше деталей, с которыми вам придется иметь дело, как я могу перечислить здесь, но это должно быть хорошей отправной точкой для вашей разведки.

Вот приятное статья, объясняющая процесс более подробно с кодом в VB.NET.

18
ответ дан 3 November 2019 в 12:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: