Здравствуйте, larisa, Вы писали:
L>Как описать Property для ActiveX объекта, наследованного от IDispatch ( без ATL ), что бы можно было обратиться к этим Property из VBscript.
Прописать их в idl-файле, и соответственно, реализовать.
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, larisa, Вы писали:
RB>Прописать их в idl-файле, и соответственно, реализовать.
Кто такой idl-файл?
У меня уже есть реализованый объект. Вот его описание.
class Math : public IDispatch
{
private:
int _CallRead;
public:
Math();
~Math();
/* IUnknown methods */
STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
STDMETHOD_(unsigned long, AddRef)(void);
STDMETHOD_(unsigned long, Release)(void);
/* IDispatch methods */
STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pcTypeInfo);
STDMETHOD(GetTypeInfo)(
unsigned int iTypeInfo,
LCID lcid,
ITypeInfo FAR* FAR* ppTypeInfo);
STDMETHOD(GetIDsOfNames)(
REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgdispid);
STDMETHOD(Invoke)(
DISPID dispidMember,
REFIID riid,
LCID lcid,
unsigned short wFlags,
DISPPARAMS FAR* pdispparams,
VARIANT FAR* pvarResult,
EXCEPINFO FAR* pexcepinfo,
unsigned int FAR* pwArgErr);
virtual int Add(int Op1, int Op2);
virtual int Sub(int Op1, int Op2);
virtual int Mul(int Op1, int Op2);
virtual int Div(int Op1, int Op2);
virtual void Shw( void );
unsigned long m_refs;
};
Понятно, что реализации всех методов есть.
И его методы нормально зовутся из VBScript и нормально обрабатываются, а вот добиться что бы обрабатывались Property не могу.
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, larisa, Вы писали:
L>>Кажется так
Ты прав, конечно. Я сегодня уже с этими пропертами так намучалась, что не очень уверена в своем имени
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;
Сначала большое спасибо Vi2>[ccode] L>> switch(dispidMember){ Vi2>... Vi2> case IDMEMBER_MATH_PROP:
Vi2> if( (wFlags & (DISPATCH_METHOD | DISPATCH_PROPERTYGET)) != 0 ) Vi2> { Vi2> // GET свойство — обработка
Vi2> // обязательно зполнить pvarResult, если он представлен Vi2> break;
C Get все в порядке -- заработало. Vi2> } Vi2> if( (wFlags & DISPATCH_PROPERTYPUT) != 0 ) Vi2> { Vi2> // PUT свойство — обработка
Vi2> break;
А с Put проблема. Как мне получить значение, которое устанавливает пользователь в макросе?
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, larisa, Вы писали:
L>>А с Put проблема. Как мне получить значение, которое устанавливает пользователь в макросе?
Vi2>Он передается в нулевом элементе параметра pdispparams.
При попытке его прочитать
Здравствуйте, Аноним, Вы писали:
А>При попытке его прочитать hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr); А>Мне возвращают ошибку DISP_E_PARAMNOTFOUND
Я забыл, что ты пользуешься DispGetParam.
[MSDN]
If you have used DispGetParam to get the right side of a property put operation, the second parameter should be DISPID_PROPERTYPUT. For example:
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, Аноним, Вы писали:
А>>При попытке его прочитать hresult = DispGetParam(pdispparams, 0, VT_I2, &varg0, puArgErr); А>>Мне возвращают ошибку DISP_E_PARAMNOTFOUND
Vi2>Я забыл, что ты пользуешься DispGetParam. Vi2>[MSDN] Vi2>If you have used DispGetParam to get the right side of a property put operation, the second parameter should be DISPID_PROPERTYPUT. For example: Vi2>
[/MSDN]
Все заработало -- я просто на прямую взяла нужный параметр, но этот способ тоже сейчас попробую.
Всем огромное спасибо! А тебе, Vi2, особое. Будешь в Киеве за мной пиво