Здравствуйте, Odi$$ey, Вы писали:
OE>- раз при создании поставил галочку на connection point у тебя в ClassView вместе с твоим интерфейсом IMyIntrf должен появится _IMyIntrfEvent
OE>- вызываешь для него контекстное меню, потом Add-Add Method и добавляешь метод, например FirstMethod( BSTR str )
OE>- компилируешь проект
OE>- вызываешь контекстное меню в том же ClassView, только уже для класса (CMyIntrf)
OE>- Add — Add Connection Point
OE>- в форме увидишь слева свой _IMyIntrfEvent, перенесешь его кнопкой > в правое поле, Finish
OE>- в CProxy_IMyIntrfEvent добавится метод Fire_FirstMethod( BSTR str )
A>>Если у меня есть метод Func(...), я передаю некоторые параметры и хочу узнать когда эти данные обработаються.
OE>вызывай в этом месте Fire_FirstMethod
OE>Как в ATL клиенте подписываться на события надо объяснять
Спасибо , с этим уже разобрался.. работает.. только мне нужно в клиент воза\вращать структуру RequestData:
typedef struct Patient {
BSTR MRN;
BSTR beforDate;
BSTR afterDate;
DWORD dwNumVisitID;
BSTR* visitIDs;
} Patient;
typedef struct RequestData {
BSTR siteID;
BSTR doctorID;
DWORD dwNumPatient;
Patient* patientData;
} RequestData;
Сейчас пишу так:
dispinterface _IDataEvents
{
properties:
methods:
[id(1), helpstring("method OnSynchronize")] HRESULT OnSynchronize([out] RequestData* respData);
};
Метод вызываеться а вот в структуре находиться какойто мусор.
Да и еще, мне нужно реализовать только С интерефейс, так что переводить структуру в SAFEARRAY не обязательно.
Почему не передаеться структура?
Метод Fire_XXXX не менял вообще, а клиент вот:
class CRequestEvSink : public CComObjectRoot,
public IDispEventImpl<0, CRequestEvSink, &__uuidof(_IDataEvents)>
{
public:
CRequestEvSink() {}
~CRequestEvSink(){}
BEGIN_COM_MAP(CRequestEvSink)
COM_INTERFACE_ENTRY_IID(__uuidof(_IDataEvents),_IDispEvent)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
DECLARE_NOT_AGGREGATABLE(CRequestEvSink)
DECLARE_NO_REGISTRY()
BEGIN_SINK_MAP(CRequestEvSink)
SINK_ENTRY_INFO(0, __uuidof(_IDataEvents), 0x1, voidFunc, infoFunc())
END_SINK_MAP()
static _ATL_FUNC_INFO* infoFunc()
{
static _ATL_FUNC_INFO _infoFunc = {CC_STDCALL, VT_EMPTY, 1, {VT_ARRAY|VT_BYREF} };
return &_infoFunc;
}
void STDMETHODCALLTYPE voidFunc(RequestData* reqData)
{
reqData->siteID;
MessageBox(NULL, "test", "", MB_OK);
}
};
и вызов:
HRESULT hr;
CComPtr<IData> ppData;
DWORD dwCookie;
hr = CoInitialize(NULL);
hr = CoCreateInstance( __uuidof(Data), NULL, CLSCTX_INPROC_SERVER, __uuidof(IData), (void**)&ppData );
CComObject<CRequestEvSink>* pSink;
hr = pSink->CreateInstance(&pSink);
hr = AtlAdvise(ppData, pSink->GetUnknown(), __uuidof(_IDataEvents), &dwCookie);
RequestData data;
hr = ppData->Synchronize(&data);
hr = AtlUnadvise(ppData, __uuidof(_IDataEvents), dwCookie);
CoUninitialize();