mxx_emb
Гость
|
|
« : 12-04-2004 13:10 » |
|
Господа, помогите решить следующую проблему: Есть COM сервер в виде DLL (in-proc)
В его IDL описан событийный интерфейс: dispinterface _ISMPPEvents { properties: methods: [id(1), helpstring("Method SMSCMessageNotification")] HRESULT SMSCMessageNotification([in] BSTR bstrMessageID, [in] BSTR bstrMessageTimeStamp, [in] long lDeliveryStatus, [in] long lError, [in] DATE DeliveryTimeStamp, [in] BSTR bstrSMSCMessage);
[id(2), helpstring("Method SMSCMessageReceived")] HRESULT SMSCMessageReceived([in] BSTR bstrDestination, [in] BSTR bstrOriginator, [in] BSTR bstrMessage, [in] long lOption, [in] DATE SMSCTimeStamp, [in] DATE Validity);
[id(3), helpstring("Method SocketClosed")] HRESULT SocketClosed([in] long lReserved); };
Необходимо на клиенте (консольное приложение) реализовать получение энтих событий.
(в голове каша по COM технологии, поэтому просьба сильно не пинать)
1.Создаю Sink Object Его реализацию взял в Инете и часть в MSDN
class CBinDataSink : public CComObjectRoot, public IDispEventImpl<0,CBinDataSink,&__uuidof(_ISMPPEvents)> { public: CBinDataSink(){} ~CBinDataSink(){}
BEGIN_COM_MAP(CBinDataSink) COM_INTERFACE_ENTRY_IID(__uuidof(_ISMPPEvents),CBinDataSink) END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT() DECLARE_NOT_AGGREGATABLE(CBinDataSink) DECLARE_NO_REGISTRY()
BEGIN_SINK_MAP(CBinDataSink) SINK_ENTRY_INFO(0, __uuidof(_ISMPPEvents), 0x1, longinfoSMSCMessageNotification, infoSMSCMessageNotification()) SINK_ENTRY_INFO(0, __uuidof(_ISMPPEvents), 0x2, longinfoSMSCMessageReceived, infoSMSCMessageReceived()) SINK_ENTRY_INFO(0, __uuidof(_ISMPPEvents), 0x3, longinfoSocketClosed, infoSocketClosed()) END_SINK_MAP()
//[id(0x1)] HRESULT SMSCMessageNotification([in] BSTR bstrMessageID, [in] BSTR bstrMessageTimeStamp, [in] long lDeliveryStatus, [in] long lError, [in] DATE DeliveryTimeStamp, [in] BSTR bstrSMSCMessage); static _ATL_FUNC_INFO* infoSMSCMessageNotification() { static _ATL_FUNC_INFO _infoSMSCMessageNotification = {CC_STDCALL, VT_I4, 6, {VT_BSTR, VT_BSTR, VT_I4, VT_I4, VT_DATE, VT_BSTR} }; return &_infoSMSCMessageNotification; }
HRESULT STDMETHODCALLTYPE longinfoSMSCMessageNotification(BSTR bstrMessageID, BSTR bstrMessageTimeStamp, long lDeliveryStatus, long lError, DATE DeliveryTimeStamp, BSTR bstrSMSCMessage) { printf("SMS\n"); //MessageBox(NULL, "Socket Close", "Socet Close", MB_OK); return 0; } //[id(0x02), HRESULT SMSCMessageReceived([in] BSTR bstrDestination, [in] BSTR bstrOriginator, [in] BSTR bstrMessage, [in] long lOption, [in] DATE SMSCTimeStamp, [in] DATE Validity); static _ATL_FUNC_INFO* infoSMSCMessageReceived() { static _ATL_FUNC_INFO _infoSMSCMessageReceived = {CC_STDCALL, VT_I4, 6, {VT_BSTR, VT_BSTR, VT_BSTR, VT_I4, VT_DATE, VT_DATE} }; return &_infoSMSCMessageReceived; }
HRESULT STDMETHODCALLTYPE longinfoSMSCMessageReceived(BSTR bstrDestination, BSTR bstrOriginator, BSTR bstrMessage, long lOption, DATE SMSCTimeStamp, DATE Validity) { printf("SMS\n"); //MessageBox(NULL, "Socket Close", "Socet Close", MB_OK); return 0; }
//[id(0x03), HRESULT SocketClosed([in] long lReserved); static _ATL_FUNC_INFO* infoSocketClosed() { static _ATL_FUNC_INFO _infoSocketClosed = {CC_STDCALL, VT_I4, 1, {VT_I4} }; return &_infoSocketClosed; } HRESULT STDMETHODCALLTYPE longinfoSocketClosed(long lReserved) { printf("SMS\n"); MessageBox(NULL, "Socket Close", "Socet Close", MB_OK); return 0; }
};
Запускаю своего консольного клиента
#define STRICT #define _ATL_APARTMENT_THREADED
#include "SMSCConnectivitySDK_i.c" #include "SMSCConnectivitySDK_h.h" #include <atlbase.h>
CComModule _Module;
#include <atlcom.h>
#include "sink.h"
main() .....
HRESULT hr; long plResult; long lRespTime = 0;
//CSink snk; DWORD dwCookie = 0;
hr = CoInitialize(NULL); if(FAILED(hr)){ printf("CoInitialize filed %d\n", hr); }
//ISMPP рабочий интерфейс CComPtr<ISMPP> pISMPP; hr = CoCreateInstance(__uuidof(SMPP), NULL, CLSCTX_INPROC_SERVER, __uuidof(ISMPP), (void**)&pISMPP); if (FAILED(hr)){ printf("CoCreateInstanse failed, error %#x\n", hr); return(-1); } CComObject<CBinDataSink>* pSink; //CComObject<CBinDataSink>* pSink = new CComObject<CBinDataSink>;
hr = pSink->CreateInstance(&pSink); if (FAILED(hr)){ printf("pSink->CreateInstance failed, error %#x\n", hr); return(-1); }
hr = AtlAdvise(pISMPP, pSink->GetUnknown(), __uuidof (ISMPPEvents), &dwCookie); if (FAILED(hr)){ printf("AtlAdvise failed, error %#x\n", hr); return(-1); } ...... идет работа с объектом .......
Все двайзиться нормально, но события не возникают. с эти COM объектом идет пример на MFC. В этом примере все события отрабатываются. Работу с ним мне необходимо утолкать в консольное приложение. Чего делаю не так? Подскажите pls C уважением mixx_emb
|