Привет всем!!! Вот изучаю COM технологию по книге Дейла Роджерсона — "Основы COM", разбираю пример с дуальным интерфейсом.
Имеется интерфейс IOperation, который содержит следующую функцию:
HRESULT __stdcall CMath::Summa(long fp_a, long fp_b, long* fp_c)
{
*fp_c = fp_a + fp_b ;
return S_OK ;
}
Если пользуюсь интерфейсом через vtbl, то все нормально, а вот если через IDispatch, то че-то не могу получить результат.
Во-первых: результат должен быть получен так же через третий параметр метода Summa, или же через 6-ой параметр метода Invoke???
На сервере Invoke реализована так:
HRESULT __stdcall CMath::Invoke(
DISPID dispidMember,
const IID& iid,
LCID, // Localization is not supported.
WORD wFlags,
DISPPARAMS* pDispParams,
VARIANT* pvarResult,
EXCEPINFO* pExcepInfo,
UINT* pArgErr)
{
if (iid != IID_NULL)
{
return DISP_E_UNKNOWNINTERFACE ;
}
Здравствуйте, ddd329, Вы писали:
D>Если пользуюсь интерфейсом через vtbl, то все нормально, а вот если через IDispatch, то че-то не могу получить результат. D>Во-первых: результат должен быть получен так же через третий параметр метода Summa, или же через 6-ой параметр метода Invoke???
Это зависит от описания параметров метода. Если параметр не имеет атрибута [retval], то он может быть получен через третий параметр метода Summa. Если же имеет, то только через 6-ой параметр метода Invoke (причем метод Summa должен получить только два параметра).
D>Результаты такие: D>1) v_res.vt == VT_EMPTY D>2) c == 0 D>ВОПРОС: Как получить результат суммы???
Нужно также смотреть на код возврата hr. У тебя он сейчас содержит код ошибки, указывающий на характер ошибочных действий. Что помогло бы тебе в анализе причин.
Здравствуйте, ddd329, Вы писали:
D>Я же привел код как реализован CMath::Invoke.
Да, пропустил. Тогда непонятно, что "hr — не содержит ошибок, я проверял". Должен возвращаться код ошибки несоответствия параметров или числа параметров.
Здравствуйте, Аноним, Вы писали:
А>А правильно ли я указываю третий параметр Summa? Который на сервере описан как: Summa(long fp_a, long fp_b, long* fp_c);