Re[2]: DispInvoke в реализации dispinterfac'а клиентом ..
От: timash  
Дата: 18.10.01 06:38
Оценка:
Здравствуйте Parfenov Denis, Вы писали:

PD>Незнаю как в Builder3, а в Builder5 можно открыть функцией Open COM сервер и посмотреть все интерфейсы,функции и параметры. Скорее всего ошибка в имени или параметре функции(если я правельно понял), попробуй использовать тип Variant, у него есть такие функции OLEProcedure, OLEFunction, попробуй так.


Я должно быть нечетко выразился. Конкретнее: У меня был сделан ручками работающий sink, вот его код

class ChannelSink: public _IxxxEvents
{
//----------------- Methods of IUnknown -----------------------
virtual HRESULT STDMETHODCALLTYPE QueryInterface(...)
{
*ppvObject = NULL;
if(riid == IID_IUnknown) *ppvObject = static_cast<IUnknown*>(this);
else if(riid == IID_IDispatch) *ppvObject = static_cast<IDispatch*>(this);
else if(riid == DIID__IxxxEvents) *ppvObject = static_cast<_IxxxEvents*>(this);
if(*ppvObject) return S_OK; else return E_NOINTERFACE;
}
virtual ULONG STDMETHODCALLTYPE AddRef() { return 1; }
virtual ULONG STDMETHODCALLTYPE Release() { return 1; }
//----------------- Methods of IDispatch ----------------------
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(...) { return E_NOTIMPL; }
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(...) { return E_NOTIMPL; }
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(...) { return E_NOTIMPL; }
virtual HRESULT STDMETHODCALLTYPE Invoke()
{
if(!pDispParams) return DISP_E_PARAMNOTFOUND;
if(dispIdMember == 1)
{
if(pDispParams->cArgs != 1) return DISP_E_BADPARAMCOUNT;
if(pDispParams->rgvarg[0].vt != (VT_VARIANT | VT_BYREF)) return DISP_E_TYPEMISMATCH;
Method1(pDispParams->rgvarg[0].pvarVal);
return S_OK;
}
...
else if(dispIdMember == N) { ... MethodN(...); ... }
}
//--------- Methods of IxxxEvents interface ------------
virtual HRESULT STDMETHODCALLTYPE Method1(VARIANT* param) { ... }
...
virtual HRESULT STDMETHODCALLTYPE MethodN() { ... }
};

Он работает на "ура", т.е. принимает входящие event'ы и перенаправляет из в соответсвующие функции. OK.

Потом я решил что так как кол-во MethodN() очень большое, то надо попытаться использовать type library info об COM-обьекте который event'ы испускает, ведь там же прописан IxxxEvents интерфейс. Для этого вот что я поменял:

GetTypeInfoCount(...) { *pctinfo = 1; return S_OK; }
GetTypeInfo(...) { *ppTInfo = <полученый ранее указатель на библиотеку типов>; <он же>->AddRef(); return S_OK; }
GetIDsOfNames(...) { return DispGetIDsOfNames(..); }
Invoke() { return DispInvoke(...); }

т.е. хотел подсократить реализациюм IDispatch в клиентском sink'е. Не работает. О том как я получал и проверял указатель на библиотеку типов COM-обьекта испускающего event'ы я уже писал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.