是在聊天窗口接收还是在主面板中接收的呢?如果是在主面板中接收,那么又是怎么在聊天窗口中及时更新聊天信息的呢?
提前祝大家节日快乐,不管有没有满意答案,周一都结帖

解决方案 »

  1.   

    请问QQ的消息接收是怎么实现的?
    -------------------------------
    QQ应该是在好友主列表对消息进行接收,然后在通过主窗体去改变子窗体(聊天窗体)中的内容,以实现信息的即时收取
    同样的道理在发送信息是也应该是通过父窗口进行发送.个人观点,如有雷同,实属巧合.
      

  2.   

    up~
    Everybody ! happy for our festival !
      

  3.   

    有个MsgOleInRich.dll
    估计是在窗口中接收的吧
      

  4.   

    应该是QQMsgRecver.dll和QQMsgFriendMng.dll这两个……
    这么看好像又是在主面板中接收的了……
      

  5.   

    个人认为应该是在主面板中接收,如果在聊天窗口接收的话,一个聊天窗口就需要一个socket,太消耗资源了。应该是主面板中接收,再根据消息内容决定更新哪个聊天窗口中的内容。
      

  6.   

    估计和socket有关,没做过 猜测
      

  7.   

    搞笑吧,看样子C#的人对C\S不太了解,QQ是用分层结构,低层接收消息,用事件回调GUI层,回调方式是用委托.看看下面源码
    #ifndef _EVENT_SUPPORT_H_
    #define _EVENT_SUPPORT_H_//C++通用事件支持宏 Copyright (c) Tencent Inc. 2001//本代码是经过对Visual C++ 7.0新引入的事件机制进行研究和反编译,
    //接近乎相同的原理,编写而来.
    //优点: 
    // 任何C++类都可作为事件源和事件接收者
    // 事件接收者的数目不限
    // 支持编译时的类型检测
    // 接口简单//Written by sjh ([email protected])
    //Version 1.1 (2001-09)//Version 1.2 (2001-10)
    //取消了DECLARE_EVENT_SUPPORT宏
    //加入DECLARE_EVENT_RECEIVER宏
    //自动判断事件接收对象是否可用,防止接收对象被delete后的访问从突
    //Version 1.3  (2002-6-12)
    //加入多线程支持
    /*使用说明:
    EVENT:
    用来在事件源中定义一个事件,事件的参数可自由定义.
    EVENT( 函数名, (参数定义), (相应的参数列表) )  HookEvent:
    为事件源添加一个事件接收者.
    Source.HookEvent(事件名,接收对象指针,接收函数) UnhookEvent:
    删除一个事件源的事件接收者.
    Source.UnhookEvent(事件名,接收对象指针,接收函数) RaiseEvent:
    触发事件源的事件.
    Source.RaiseEvent(事件名(事件参数)) DECLARE_EVENT_RECEIVER(classname)

    代码示例://事件源
    class CSource 
    {
    public:

    //为CSource添加一个 void OnTimer(void) 的事件
    EVENT(OnTimer,(),()); //为CSource添加一个 void OnData(BYTE* pBuf, DWORD nLen) 的事件
    EVENT(OnData,(BYTE* pBuf,DWORD nLen),(pBuf,nLen));public:
    void FireOnTimer()//内部也可以激发事件
    {
    RaiseEvent( OnTimer() );//使用宏触发OnTimer事件 OnTimer();//也可直接调用OnTimer
    }
    }//接收者
    class CReceiver
    {
    DECLARE_EVENT_RECEIVER(CReceiver)
    public:
    void OnTimer();
    void OnData(BYTE* pBuf,DWORD nLen);
    }; ...CSource s;
    CReceiver r;s.HookEvent(OnTimer, &r, &CReceiver::OnTimer);
    s.HookEvent(OnData, &r, &CReceiver::OnData);s.RaiseEvent(OnTimer()); //激发s的OnTimer事件BYTE buf[128];
    s.RaiseEvent(OnData(buf,128)); //激发s的OnData事件 ...s.UnhookEvent(OnData,&r,&CReceiver::OnData);
    */#define EVENT(f,p,v) DECLARE_EVENT(public,f,p,v)//DECLARE_EVENT定义事件
    //access为事件激发函数的访问类型
    //如果事件只允许在内部被激发,可以将access设为protected
    #define DECLARE_EVENT(access,f,p,v) \
    private:\
    struct _event_node_##f\
    {\
    virtual bool _Invoke p = 0;\
    virtual bool _IsEqual(void* pt,void* pf) = 0;\
    _event_node_##f* _pNext;\
    };\
    template<class T,class F>\
    struct _handler_##f: public _event_node_##f\
    {\
    T* _pThis;\
    F _pFun;\
    int _nPtrData;\
    bool _Invoke p\
    {\
    bool _b = false;\
    try{if(memcmp((BYTE*)_nPtrData,"################",16)==0)_b=true;}catch(...){}\
    if(_b)(_pThis->*_pFun)v;return _b;\
    }\
    bool _IsEqual(void* pt,void* pf)\
    {\
    if( (void*)_pThis==pt && (pf==NULL || *((void**)&_pFun)==pf))\
    return true;\
    return false;\
    }\
    };\
    struct _nodes_##f\
    {\
    CRITICAL_SECTION m_cs;\
    _nodes_##f(){_pNodes=NULL;InitializeCriticalSection(&m_cs);}\
    ~_nodes_##f(){DeleteCriticalSection(&m_cs);_event_node_##f* pNode = _pNodes;_event_node_##f* pTemp;while(pNode){pTemp=pNode->_pNext;delete pNode;pNode=pTemp;}}\
    _event_node_##f* _pNodes;\
    void _Lock(){EnterCriticalSection(&m_cs);}\
    void _Unlock(){LeaveCriticalSection(&m_cs);}\
    }_xNodes_##f;\
    public:\
    template<class T,class F>\
    long HookEvent_##f(T* pThis,F pFun)\
    {\
    if(pThis)\
    {\
    _xNodes_##f._Lock();\
    _handler_##f<T,F>* pNode = new _handler_##f<T,F>;\
    pNode->_pThis = pThis;\
    pNode->_nPtrData = (int)pThis + pThis->_xEventReceiver.nOffset;\
    pNode->_pFun = pFun;\
    pNode->_pNext = _xNodes_##f._pNodes;\
    _xNodes_##f._pNodes = pNode;\
    _xNodes_##f._Unlock();\
    return 1;\
    }\
    return 0;\
    }\
    template<class T,class F>\
    long UnhookEvent_##f(T* pThis,F pFun)\
    {\
    _xNodes_##f._Lock();\
    _event_node_##f* pNode = _xNodes_##f._pNodes;\
    _event_node_##f* pPre = NULL;\
    long nResult = 0;\
    void* pTemp = pFun==NULL ? NULL : *((void**)&pFun);\
    while(pNode)\
    {\
    if(pNode->_IsEqual(pThis,pTemp))\
    {\
    if(pPre)\
    pPre->_pNext = pNode->_pNext;\
    else\
    _xNodes_##f._pNodes = pNode->_pNext;\
    delete pNode;\
    if(pPre)\
    pNode = pPre->_pNext;\
    else\
    pNode = _xNodes_##f._pNodes;\
    if(pTemp){nResult=1;break;}\
    }\
    else\
    {\
    pPre = pNode;\
    pNode = pNode->_pNext;\
    }\
    }\
    _xNodes_##f._Unlock();\
    return nResult;\
    }\
    void RemoveAllEvent_##f()\
    {\
    _xNodes_##f._Lock();\
    _event_node_##f* pNode = _xNodes_##f._pNodes;\
    _event_node_##f* pTemp = NULL;\
    while(pNode)\
    {\
    pTemp = pNode->_pNext;\
    delete pNode;\
    pNode = pTemp;\
    }\
    _xNodes_##f._pNodes = NULL;\
    _xNodes_##f._Unlock();\
    }\
    access:\
    void f p\
    {\
    _xNodes_##f._Lock();\
    try{\
    _event_node_##f* pNode = _xNodes_##f._pNodes;\
    _event_node_##f* pPre = NULL;\
    while(pNode)\
    {\
    if( (pNode->_Invoke v) )\
    { pPre = pNode; pNode = pNode->_pNext; }\
    else\
    {TRACE(_T("Detected died event receiver , removed ok .\n"));if(pPre){pPre->_pNext = pNode->_pNext; delete pNode; pNode = pPre->_pNext;}\
    else{_xNodes_##f._pNodes = pNode->_pNext; delete pNode; pNode = _xNodes_##f._pNodes?_xNodes_##f._pNodes:NULL;}\
    }\
    }\
    }catch(...){_xNodes_##f._Unlock();throw;}\
    _xNodes_##f._Unlock();\
    }\#define HookEvent(e,t,f) HookEvent_##e(t,f)
    #define UnhookEvent(e,t,f) UnhookEvent_##e(t,f)
    #define RemoveAllEvent(e) RemoveAllEvent_##e()
    #define RaiseEvent(e) e#define DECLARE_EVENT_RECEIVER(classname) \
    public:\
    struct _event_Receiver\
    {\
    _event_Receiver(){memset(data,'#',16);nOffset=offsetof(classname,_xEventReceiver);}\
    ~_event_Receiver(){memset(data,0,16);}\
    BYTE data[16];\
    int nOffset;\
    }_xEventReceiver;\
    #endif //_EVENT_SUPPORT_H_
      

  8.   

    LZ自己写个SOCKET程序就知道了,哪有聊天窗口开个SOCKET接收的,真是晕死
      

  9.   

    一個SOCKET接收所有信息的,就一個監聽端口。後台處理後再傳給子窗口。