Здравствуйте, larisa, Вы писали:
L> IDMEMBER_MATH_PROP_GET = 6,
L> IDMEMBER_MATH_PROP_SET = 7,
IDMEMBER_MATH_PROP = 6,
Свойства должны иметь один DISPID на оба способа: как get, так и set/put (так же как и putref).
L> Math::GetIDsOfNames(...)
L>{
L>static MEMBERDESC rgmdCPoint[] = {
L> {OLESTR("Add"), IDMEMBER_MATH_ADD, NULL, 0},
L> {OLESTR("Sub"), IDMEMBER_MATH_SUB, NULL, 0},
L> {OLESTR("Mul"), IDMEMBER_MATH_MUL, NULL, 0},
L> {OLESTR("Div"), IDMEMBER_MATH_DIV, NULL, 0},
L> {OLESTR("Shw"), IDMEMBER_MATH_SHW, NULL, 0}
{OLESTR("Prop"), IDMEMBER_MATH_PROP, NULL, 0}
GetIDsOfNames должна реализовать соответствие имен и их DISPIDов независимо от типа функции (метод или свойство). Фактический вызов определяется клиентом.
L> Math::Invoke(DISPID dispidMember,...,unsigned short wFlags,...)
Вот эта функция и выполняет всю работу. wFlags говорит, что за функциональность требуется от имени, соответствующему dispidMember.
L> switch(dispidMember){
...
case IDMEMBER_MATH_PROP:
if( (wFlags & (DISPATCH_METHOD | DISPATCH_PROPERTYGET)) != 0 )
{
// GET свойство - обработка
// обязательно зполнить pvarResult, если он представлен
break;
}
if( (wFlags & DISPATCH_PROPERTYPUT) != 0 )
{
// PUT свойство - обработка
break;