Вызов метода элемента ActiveX
От: sysxxx  
Дата: 06.12.08 09:07
Оценка:
В 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++. Прикладные вопросы' — Кодт
Re: Вызов метода элемента ActiveX
От: Кодт Россия  
Дата: 07.12.08 00:43
Оценка:
Здравствуйте, 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;
}


Собственно, это и будет ответом на все твои заданные вопросы.
Перекуём баги на фичи!
Re[2]: Вызов метода элемента ActiveX
От: Vi2 Удмуртия http://www.adem.ru
Дата: 08.12.08 07:44
Оценка:
Здравствуйте, Кодт, Вы писали:

К>...
К>  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) и корректно удалить.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Вызов метода элемента ActiveX
От: Кодт Россия  
Дата: 12.12.08 16:23
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Если же реально передается МАССИВ байт, то исходная мысль все равно неверная: таким путем нельзя передавать массив, т.е. VARIANT с VT_UI1|VT_BYREF не может содержать массив. Нужно принять, скопировать в нормальный SAFEARRAY(BYTE) и корректно удалить.


Конечно же, там передаётся массив байт. Ну а VT_BYREF это я тупо скопировал, не особо задумываясь о сути. Конечно, нужно перепереть в SAFEARRAY.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.