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;
}

...全文
162 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ad 2000-08-11
  • 打赏
  • 举报
回复
问题已解决,但不是用PostMessage,而是Fire Event.
hyzx2000 2000-08-10
  • 打赏
  • 举报
回复
建议:不要使用GetParent()获取父窗口,而是在控件添加一个变量
HWND m_hWndParent;
增加一个接口
void SetParent( CWnd * pWnd )
{
m_hWndParent = pWnd->GetSafeHwnd();
}

在要发送消息的地方写上:
PostMessage( m_hWndParent, .... );

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧