Re[2]: connection point, проблеммы
От: atrofa Украина  
Дата: 20.09.04 07:29
Оценка:
Здравствуйте, 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();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.