Получение результата с помощью Invoke
От: ddd329  
Дата: 12.01.11 15:04
Оценка:
Привет всем!!! Вот изучаю 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 ;
}

::SetErrorInfo(0, NULL) ;

HRESULT hr = m_pITypeInfo->Invoke( //pITypeLib->GetTypeInfoOfGuid(IID_IOperation,&m_pITypeInfo) ;
static_cast<IDispatch*>(this),
dispidMember, wFlags, pDispParams,
pvarResult, pExcepInfo, pArgErr) ;
return hr ;
}
//------------------------------------------------------------------------------------------------------------------------
На клиенте код вызова такой:
OleInitialize(NULL);
HRESULT hr;
wchar_t progid[] = L"SERVER_COM.Math";
CLSID clsid;
hr = CLSIDFromProgID(progid,&clsid);
IDispatch *pIDispatch = NULL;

IOperation* pIOperation = NULL ;
hr = CoCreateInstance(clsid,
NULL,
CLSCTX_LOCAL_SERVER,
IID_IDispatch,
(void**)&pIDispatch) ;

DISPID dispid;
OLECHAR *name = L"Summa";

hr = pIDispatch->GetIDsOfNames(IID_NULL,
&name,
1,
GetUserDefaultLCID(),
&dispid
);

unsigned int c = 0;//третий параметр Summa, через который должен быть возвращен результат

VARIANTARG *v_arg = new VARIANTARG [3];
VariantInit(&v_arg[0]);
VariantInit(&v_arg[1]);
VariantInit(&v_arg[2]);
v_arg[0].vt = VT_UINT;
v_arg[0].uintVal = 5;
v_arg[1].vt = VT_UINT;
v_arg[1].uintVal = 7;
v_arg[2].vt = VT_BYREF|VT_UINT;
v_arg[2].puintVal = &c;

VARIANTARG v_res;
VariantInit(&v_res);

DISPPARAMS dispparams = {v_arg,
NULL,
3,
0};

hr = pIDispatch->Invoke(dispid,
IID_NULL,
GetUserDefaultLCID(),
DISPATCH_METHOD,
&dispparams,
&v_res,
NULL,
NULL
);
..............................................................
OleUninitialize() ;
//----------------------------------------------------------------------------------------------------------
Результаты такие:
1) v_res.vt == VT_EMPTY
2) c == 0
ВОПРОС: Как получить результат суммы???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.