В ActiveX разбираюсь слабо, поэтому помогите:
есть элемент ActiveX
в нем метод
STDMETHODIMP Test::GetImage()
{
HRESULT hr;
try {
if(m_pWC)
{
VARIANT lpCurrImage;
VariantInit(&lpCurrImage);
lpCurrImage.vt = VT_BYREF | VT_UI1;
if( SUCCEEDED(hr = m_pWC->GetCurrentImage(&lpCurrImage.pbVal)) )
{
HRTEST( "Get Current Image", NULL, lpCurrImage);//?
// можно ли так: return lpCurrImage;//?
}
}
}
catch( _com_error& com_err ) {
return SetErrorAddDescr( com_err, "::GetImage" );}
return S_OK;
}
метод интерфейса:
VARIANT Test::GetImage()
{
VARIANT result;
InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}
error C2664: 'hr_test' : cannot convert parameter 2 from 'struct tagVARIANT *' to 'long'
подскажите как происходит передача значений из первого метода в метод интерфейса??? Т.е. мне нужно чтобы метод интерфейса возвращал знанение lpCurrImage.
+ еще не понятно: у меня переменная lpCurrImage вообще-то типа BYTE* но его кажется в InvokeHelper нельзя передавать ? Походу надо передавать типа VARIANT. Но почему тогда в ошибке требуется long?
добавлена раскраска — Кодт
07.12.08 03:30: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Здравствуйте, sysxxx, Вы писали:
S>
S>STDMETHODIMP Test::GetImage()
S>
S>метод интерфейса:
S>S>VARIANT Test::GetImage()
S>
Ты уж определись, что возвращать — HRESULT или VARIANT.
Но вообще, методы ком-интерфейсов должны возвращать HRESULT, а всё остальное — через out-параметры.
Поэтому сигнатура там должна быть
HRESULT /*оно же STDMETHODIMP*/ Test::GetImage(/*[retval]*/ VARIANT* pImage)
{
if(!pImage) return E_POINTER;
VARIANT image; VariantInit(&image); image.vt=VT_UI1|VT_BYREF;
if(FAILED(hr = m_pWC->GetCurrentImage(&image.pbVal)))
{
// тут прямо и вернём ошибку, зачем нам исключения какие-то метать?
return SetErrorAddDescr(......);
}
*pImage = image;
return S_OK;
}
Собственно, это и будет ответом на все твои заданные вопросы.
Здравствуйте, Кодт, Вы писали:
К>...
К> VARIANT image; VariantInit(&image); image.vt=VT_UI1|VT_BYREF;
К> if(FAILED(hr = m_pWC->GetCurrentImage(&image.pbVal)))
К>...
К>Собственно, это и будет ответом на все твои заданные вопросы.
А зачем использовать VT_BYREF? Чем плохо?
К> VARIANT image;
К> image.vt=VT_UI1;
К> if(FAILED(hr = m_pWC->GetCurrentImage(&image.bVal)))
Если же реально передается МАССИВ байт, то исходная мысль все равно неверная: таким путем нельзя передавать массив, т.е. VARIANT с VT_UI1|VT_BYREF не может содержать массив. Нужно принять, скопировать в нормальный SAFEARRAY(BYTE) и корректно удалить.
Здравствуйте, Vi2, Вы писали:
Vi2>Если же реально передается МАССИВ байт, то исходная мысль все равно неверная: таким путем нельзя передавать массив, т.е. VARIANT с VT_UI1|VT_BYREF не может содержать массив. Нужно принять, скопировать в нормальный SAFEARRAY(BYTE) и корректно удалить.
Конечно же, там передаётся массив байт. Ну а VT_BYREF это я тупо скопировал, не особо задумываясь о сути. Конечно, нужно перепереть в SAFEARRAY.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>