ruti

解决方案 »

  1.   

    class CServer : public CCmdTarget
    {
    HWND m_TreeViewWnd;
        CIPChannel m_Listen;
    OArray <CStation> m_StationList;
    BOOL ReadStationInfo(HWND hWnd);
    DWORD m_dwCookie ;   //用于标记一个连接点
    BOOL ConnectAdvise();
    BOOL ReponseRequest(const BYTE RequestPack[], const int &len); //分析WEB请求报文 00H报文
    BYTE GetPackType(const BYTE RequestPack[]);
    BOOL DoCancelCmd(const BYTE &Code);
    BOOL DoExecCmd(const BYTE &Code);
    public:
     
    BOOL Start(HWND hWnd);
    BOOL Stop();

    CServer()
    {
            m_TreeViewWnd = NULL;   
    };
    virtual ~CServer();
        void OnRead(LPCTSTR str);
    void OnAccept(LPCTSTR str);
    // Generated message map functions
    protected:
    virtual void OnFinalRelease();
    DECLARE_MESSAGE_MAP()
    DECLARE_DISPATCH_MAP()
    DECLARE_INTERFACE_MAP()
    };
    ////////////////////////////实现代码
    #include "stdafx.h"
    #include "server.h"
    #include "XmlDataSetParse.h"
    #include "adorecordset.h"const IID DIID__DIPChannelEvents = {0x3A9C6312,0xE650,0x43F8,{0xBC,0xCA,0x1C,0x37,0x06,0x5E,0xCE,0x41}};void CServer::OnFinalRelease()
    {
    CCmdTarget::OnFinalRelease();
    }BEGIN_MESSAGE_MAP(CServer, CCmdTarget)
    //{{AFX_MSG_MAP(CMyChannel)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()BEGIN_DISPATCH_MAP(CServer, CCmdTarget)
    DISP_FUNCTION_ID(CServer,"Accept",1,OnAccept,VT_EMPTY, VTS_BSTR)
    DISP_FUNCTION_ID(CServer,"EvRead",2,OnRead,VT_EMPTY, VTS_BSTR)
    END_DISPATCH_MAP()BEGIN_INTERFACE_MAP(CServer, CCmdTarget)
    INTERFACE_PART(CServer, DIID__DIPChannelEvents, Dispatch)
    END_INTERFACE_MAP()void CServer::OnRead(LPCTSTR str)
    {
        AfxMessageBox("read");
    }
    void CServer::OnAccept(LPCTSTR str)
    {
        AfxMessageBox(str);
    }
    BOOL CServer::Stop()
    {
      return AfxConnectionUnadvise(  m_Listen.GetControlUnknown(), //可连接对象的接口指针
                  DIID__DIPChannelEvents  , 
    GetIDispatch(FALSE),  
    FALSE, 
    m_dwCookie );
    }
    /////////////////////////////////////////////////////////////////////////////
    BOOL CServer::ConnectAdvise()
    {
    BOOL bSuccess = AfxConnectionAdvise( 
       m_Listen.GetControlUnknown(), //可连接对象的接口指针
       DIID__DIPChannelEvents  , //连接接口ID
       GetIDispatch(FALSE), //把内嵌的IDispatch实现类的一个对象实例m_xDispatch传了出去//get the IDispatch assocaiated with Mainframe...
       FALSE, //donod addref
       &m_dwCookie );//cookie to break connection later...
        
    /*  BOOL bSuccess = FALSE;
     LPCONNECTIONPOINTCONTAINER pConnPtCont;
     LPUNKNOWN pUnknown = m_Channel.GetControlUnknown();
     ASSERT(pUnknown);
         if (SUCCEEDED(pUnknown->QueryInterface(IID_IConnectionPointContainer,(LPVOID *)&pConnPtCont)))
     {
     ASSERT(pConnPtCont != NULL);
     LPCONNECTIONPOINT pConnPt = NULL;
     if (SUCCEEDED(pConnPtCont->FindConnectionPoint(DIID__DIPChannelEvents,&pConnPt)))
     {
     ASSERT(pConnPt != NULL);
     LPUNKNOWN pUnknownSink = GetIDispatch(FALSE);
     if (SUCCEEDED(pConnPt->Advise( pUnknownSink, &m_dwCookie )))
                     bSuccess = TRUE;
                 pConnPt->Release();
     if (bSuccess) 
                     pUnknownSink->Release(); 
     }
     pConnPtCont->Release();
     }*/
     return bSuccess;
    }BOOL CServer::ReadStationInfo(HWND hWnd)
    {
     }
    BOOL CServer::ReponseRequest(const BYTE RequestPack[], const int &len) //分析WEB请求报文 00H报文
    {
         return TRUE;
    }
    BOOL CServer::DoExecCmd(  const BYTE &Code)
    {
    return TRUE;
    }
    BOOL CServer::DoCancelCmd(const BYTE &Code)
    {
    return TRUE;
    }
    BYTE CServer::GetPackType(const BYTE RequestPack[])
    {
      return TYPE_UNKNOWN;
    }
    BOOL CServer::Start(HWND hWnd)
    {
    m_TreeViewWnd = hWnd;
        ReadStationInfo(hWnd);
    //m_Listen.Create(_T("IPCHANNEL.IPChannelCtrl"),WS_CHILD | WS_VISIBLE ,
        //      CRect(0, 0, 20, 20), AfxGetMainWnd(), 1);
    BOOL bSucceed ;    m_Listen.Create(_T("IPCHANNEL.IPChannelCtrl"),WS_CHILD | WS_VISIBLE ,
              CRect(0, 0, 20, 20), AfxGetMainWnd(), 1); EnableAutomation();

        if (!ConnectAdvise()) return FALSE;
        m_Listen.Open(0,"","","",0,3000);
     
    return TRUE;
    }
     
    CServer::~CServer()
    {
    }
    以上是我的一个使用COM事件代码实例,
    首先要头文件中加入
    DECLARE_DISPATCH_MAP()
    DECLARE_INTERFACE_MAP()
    CPP中手工加入const IID DIID__DIPChannelEvents = {0x3A9C6312,0xE650,0x43F8,{0xBC,0xCA,0x1C,0x37,0x06,0x5E,0xCE,0x41}};BEGIN_DISPATCH_MAP(CServer, CCmdTarget)
    DISP_FUNCTION_ID(CServer,"Accept",1,OnAccept,VT_EMPTY, VTS_BSTR)
    DISP_FUNCTION_ID(CServer,"EvRead",2,OnRead,VT_EMPTY, VTS_BSTR)
    END_DISPATCH_MAP()BEGIN_INTERFACE_MAP(CServer, CCmdTarget)
    INTERFACE_PART(CServer, DIID__DIPChannelEvents, Dispatch)
    END_INTERFACE_MAP()然后就可以写事件响应函数
    void CServer::OnRead(LPCTSTR str)
    {
        AfxMessageBox("read");
    }
    void CServer::OnAccept(LPCTSTR str)
    {
        AfxMessageBox(str);
    }
    在创建ActiveX时要连接连接点,调用ConnectAdvise().
    BOOL CServer::Start(HWND hWnd)
    {
    m_TreeViewWnd = hWnd;
        ReadStationInfo(hWnd);
    //m_Listen.Create(_T("IPCHANNEL.IPChannelCtrl"),WS_CHILD | WS_VISIBLE ,
        //      CRect(0, 0, 20, 20), AfxGetMainWnd(), 1);
    BOOL bSucceed ;    m_Listen.Create(_T("IPCHANNEL.IPChannelCtrl"),WS_CHILD | WS_VISIBLE ,
              CRect(0, 0, 20, 20), AfxGetMainWnd(), 1); EnableAutomation();

        if (!ConnectAdvise()) return FALSE;
        m_Listen.Open(0,"","","",0,3000);
     
    return TRUE;
    }
     
      

  2.   

    1.在引出接口中添加方法。
    2。编译idl
    3。在组建类上点右键,选实现连接点。在包装类中就出现该函数了
      

  3.   

    xiaohyy(醉大饿极),你说的是怎么做连接点吧,现在的问题是我已经做完了com,用别的语言(C#)都能看到连接点函数,在包装雷里看到的却是
    //comment out the emit beacause the return value is invalid
      

  4.   

    这种错误我遇到过,//comment out the emit beacause the return value is invalid
    你COM组件的返回值类型是什么?我曾经在Delphi做的COM组件中设置的参数类型为BYTE型,
    结果在VC中加入组件后产生的包装类中就出现了这种错误,后来将参数类型改为long就没这个错误了,不知道是为什么?