COM C++ IDispatch Invoke
От: fuxx Россия  
Дата: 02.06.04 19:38
Оценка:
Вопрос вот какой:
Есть функция которую хочется вызвать при помощи IDispatch.
Вот прототип:

void GetVariable ( [in] BSTR Name, [out] VARIANT Value );


Делаю так:


HRESULT hr;
DISPPARAMS params;
VARIANTARG Args[2];
BSTR VarName;
 
VarName = SysAllocString ( Name );
 
::VariantInit ( &Args[0] );
Args[0].vt = VT_BSTR;
Args[0].bstrVal = VarName;
::VariantInit ( &Args[1] );
// Если здесь Args.vt = VT_BYREF | VT_VARIANT получаю ошибку DISP_E_BADVARTYPE
 
params.rgvarg = Args;
params.rgdispidNamedArgs = 0;
params.cArgs = 2;
params.cNamedArgs = 0;
 
hr = dispatch->Invoke ( FuncDispID, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &params, NULL, 0, 0 );
if ( !SUCCEEDED ( hr ) )
{
     throw "Function failed";
}


// Проблема в том, что здесь Args[1].vt is VT_EMPTY
PrintValue ( Args[1] );

Вопрос значит такой — как из C++ получать значения [out] параметров при вызове через
IDispatch?
Сергей
Re: COM C++ IDispatch Invoke
От: Vi2 Удмуртия http://www.adem.ru
Дата: 03.06.04 03:46
Оценка:
Здравствуйте, fuxx, Вы писали:

F>Есть функция которую хочется вызвать при помощи IDispatch.

F>Вот прототип:

F>void GetVariable ( [in] BSTR Name, [out] VARIANT Value );


[MSDN]
The [out] attribute indicates that a parameter that acts as a pointer and its associated data in memory are to be passed back from the called procedure to the calling procedure.

The [out] attribute must be a pointer.
[/MSDN]

Поэтому параметр Value должен быть указателем.

Приведи, пожалуйста, описание этой функции в IDL формате.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: COM C++ IDispatch Invoke
От: fuxx Россия  
Дата: 03.06.04 10:19
Оценка: 10 (1)
Здравствуйте, Vi2, Вы писали:

Vi2>Приведи, пожалуйста, описание этой функции в IDL формате.

Да уж все решилось. Вот просто неправильно делал:

Правильно будет примероно так:

::VariantInit ( &Args[1] );
Args[1].vt = VT_BSTR;
Args[1].bstrVal = VarName;
::VariantInit ( &Args[0] );
Args[0].vt = VT_BYREF | VT_VARIANT;
VARIANT Ret;
::VariantInit ( &Ret );
Args[0].pvarVal = &Ret;
Сергей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.