ActiveX控件如何向应用程序发消息?
ad 2000-08-10 11:37:00 由于我公司的产品对串行通讯有特殊要求,用API或MSCOMM控件都不合适,所以我自己写了一个串口的驱动程序,为方便使用驱动程序,又写了一个基于这个驱动程序的ACTIVEX控件,控件中创建一个线程测试驱动程序的接收缓冲区状态,如果接收到新的字节,就向父窗口发一个消息,但如何发消息呢?我尝试使用GetParent(),但这一句运行时出错,为什么?
部分代码:
UINT CFaCommCtrl::CommReceivingProc(LPVOID lpData)
//此函数是静态成员函数,实际上可以改为全局函数
{
CFaCommCtrl *pCtrl = (CFaCommCtrl *)lpData;
while(1){
DWORD l = 0;
if(DeviceIoControl(pCtrl->m_hVxd, FAIOC_TEST_RBUFFER, NULL, 0, NULL,1,&l,0)){
CWnd *pWnd = pCtrl->GetParent(); //此行出错
/*if(pWnd != NULL)
pWnd->PostMessage(0x0401, 1);
*/
}
}
return 0;
}
BOOL CFaCommCtrl::SetPortOpen(BOOL bOpen)
{
if(bOpen){
//...
m_hVxd = CreateFile(s,0,0,0,CREATE_NEW,FILE_FLAG_DELETE_ON_CLOSE,0);
//...
int portBase;
switch(m_nPort){
case 1: portBase = 0x3f8; break;
case 2: portBase = 0x2f8; break;
case 3: portBase = 0x3e8; break;
case 4: portBase = 0x2e8; break;
}
for(int i = 0; i < 8; i++)
_inp(portBase + i);
//不知道为什么,必须加上面这几行代码,否则在有些机器上无法工作
//...
g_hCommWatchThread =
AfxBeginThread(CommReceivingProc,
this, //将类的地址传给CommReceivingProc THREAD_PRIORITY_LOWEST,
0,
NULL);
//...
}
else{
//...
}
return TRUE;
}