ruti
解决方案 »
- PostMessage发送消息传送结构体数组的问题
- 程序运行时提示缺少MFC42D.DLL是什么原因?
- 键盘钩子的过程处理函数,那个参数代表WM_KEYDOWN和WM_KEYUP动作呢?
- 如何自动生成文件名?
- 用winpcap抓包,协议分析遇到的编程问题,内有代码,调试没问题,运行有问题。
- 如何计算2的n次方啊,有这方面的函数吗
- 给一个读写文件的程序,用C语言里的FILE.
- 各位大侠,请教一个很基础的问题。(*送分*)
- 初学者:简单问题求教
- 强制类型转换:int i=244;BYTE b=(BYTE)i;为什么结果b会等于零?BYTE不是无符号的吗?
- 如何将视频文件的第一帧画面取出存成BMP文件?
- 100分求教 CSocket,线程
{
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。编译idl
3。在组建类上点右键,选实现连接点。在包装类中就出现该函数了
//comment out the emit beacause the return value is invalid
你COM组件的返回值类型是什么?我曾经在Delphi做的COM组件中设置的参数类型为BYTE型,
结果在VC中加入组件后产生的包装类中就出现了这种错误,后来将参数类型改为long就没这个错误了,不知道是为什么?