Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Отлавливание событий COM сервера  (Прочитано 5434 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines