Re[4]: Property для ActiveX объекта
От: larisa Украина  
Дата: 05.07.04 15:48
Оценка:
Здравствуйте, rus blood, Вы писали:


RB>Круто. Реализацию GetIDsOfNames и Invoke покажи, плз.

Постараюсь более или мение корректно выдрать. Ага чт бы не забыть

........................
enum IDMEMBER_MATH {
    IDMEMBER_MATH_ADD = 1,
    IDMEMBER_MATH_SUB = 2,
    IDMEMBER_MATH_MUL = 3,
    IDMEMBER_MATH_DIV = 4,
    IDMEMBER_MATH_SHW = 5,
    IDMEMBER_MATH_PROP_GET = 6,
    IDMEMBER_MATH_PROP_SET = 7,

    IDMEMBER_MATH_MAX
};

........................

STDMETHODIMP
    Math::GetIDsOfNames(
        REFIID riid,

        OLECHAR FAR* FAR* rgszNames,
        unsigned int cNames,
        LCID lcid,
        DISPID FAR* rgdispid)
{

static MEMBERDESC rgmdCPoint[] = {
    {OLESTR("Add"),    IDMEMBER_MATH_ADD,   NULL,   0},
    {OLESTR("Sub"),    IDMEMBER_MATH_SUB,   NULL,   0},
    {OLESTR("Mul"),    IDMEMBER_MATH_MUL,   NULL,   0},
    {OLESTR("Div"),    IDMEMBER_MATH_DIV,   NULL,   0},
    {OLESTR("Shw"),    IDMEMBER_MATH_SHW,   NULL,   0}
};

    // this object only exposed the "default" interface.
    //
    if(!IsEqualIID(riid, IID_NULL))
      return ResultFromScode(DISP_E_UNKNOWNINTERFACE);

    return SPolyGetIDsOfNames(
      rgmdCPoint, DIM(rgmdCPoint), rgszNames, cNames, lcid, rgdispid);
}
//---------------------------------------------------------------------------
STDMETHODIMP Math::Invoke(
        DISPID dispidMember,
        REFIID riid,
        LCID lcid,
        unsigned short wFlags,
        DISPPARAMS FAR* pdispparams,
        VARIANT FAR* pvarResult,
        EXCEPINFO FAR* pexcepinfo,
        unsigned int FAR* puArgErr)
{
    unsigned int uArgErr;
    HRESULT hresult;
    VARIANTARG varg0,varg1;

    VARIANT varResultDummy;

    UNUSED(lcid);
    UNUSED(pexcepinfo);

    // make sure the wFlags are legal
    if(wFlags & ~(DISPATCH_METHOD | DISPATCH_PROPERTYGET | DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF))
      return ResultFromScode(E_INVALIDARG);

    // this object only exposes a "default" interface.
    //
    if(!IsEqualIID(riid, IID_NULL))
      return ResultFromScode(DISP_E_UNKNOWNINTERFACE);

    // this makes the following code a bit simpler

    if(puArgErr == NULL)
      puArgErr = &uArgErr;
    if(pvarResult == NULL)
      pvarResult = &varResultDummy;

    switch(dispidMember){

        case IDMEMBER_MATH_ADD:
            VariantInit(&varg0);
            VariantInit(&varg1);
            // assume the return type is void, unless we find otherwise.
            VariantInit(pvarResult);

            hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
            if(hresult != NOERROR)
                return hresult;
              hresult = DispGetParam(pdispparams, 1, VT_I2, &varg1, puArgErr);
            if(hresult != NOERROR)
                return hresult;

            V_VT(pvarResult) = VT_I2;
            V_I2(pvarResult) = Add(V_I2(&varg0),V_I2(&varg1));
            break;

        case IDMEMBER_MATH_SUB:
            VariantInit(&varg0);
            VariantInit(&varg1);
            // assume the return type is void, unless we find otherwise.
            VariantInit(pvarResult);

            hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
            if(hresult != NOERROR)
                return hresult;
            hresult = DispGetParam(pdispparams, 1, VT_I2, &varg1, puArgErr);
            if(hresult != NOERROR)
                return hresult;

            V_VT(pvarResult) = VT_I2;
            V_I2(pvarResult) = Sub(V_I2(&varg0),V_I2(&varg1));
            break;

        case IDMEMBER_MATH_MUL:
            VariantInit(&varg0);
            VariantInit(&varg1);
            // assume the return type is void, unless we find otherwise.
            VariantInit(pvarResult);

            hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
            if(hresult != NOERROR)
                return hresult;
            hresult = DispGetParam(pdispparams, 1, VT_I2, &varg1, puArgErr);
            if(hresult != NOERROR)
                return hresult;

            V_VT(pvarResult) = VT_I2;
            V_I2(pvarResult) = Mul(V_I2(&varg0),V_I2(&varg1));
            break;

        case IDMEMBER_MATH_DIV:
            VariantInit(&varg0);
            VariantInit(&varg1);
            // assume the return type is void, unless we find otherwise.
            VariantInit(pvarResult);

            hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr);
            if(hresult != NOERROR)
                return hresult;
            hresult = DispGetParam(pdispparams, 1, VT_I2, &varg1, puArgErr);
            if(hresult != NOERROR)
                return hresult;

            V_VT(pvarResult) = VT_I2;
            V_I2(pvarResult) = Div(V_I2(&varg0),V_I2(&varg1));
            break;

        case IDMEMBER_MATH_SHW:
            Shw();
            break;

        default:
            return ResultFromScode(DISP_E_MEMBERNOTFOUND);
    }
    return NOERROR;
}
//---------------------------------------------------------------------------



Кажется так
С ув. Лариса
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.