Здравствуйте, 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;
}
//---------------------------------------------------------------------------
Кажется так
С ув. Лариса