关于消息的菜鸟问题!

shangguohua 2003-07-15 10:37:31
小弟初学C++写了一个简单的串口通讯程序,主线程有一窗体完成接收数据,辅助线程用来监视串口。
1)、当有数据到来时辅助线程:
PostMessage(m_hWnd,WM_COMMNOTIFY,(WPARAM)hCommDev,NULL);
送消息给主线程,
2)、在主线程中加了一个消息映射:
ON_MESSAGE(WM_COMMNOTIFY,OnCommRecvNotify);
3)、在主线程头文件加入消息处理函数说明:
afx_msg LRESULT OnCommRecvNotify(WPARAM wParam,LPARAM lParam);
4)、实现该消息处理函数。
能正常工作!

问:现在想把它改成DLL供VB调用,而在DLL中不想它有窗体;
请问应该怎样来实现消息的传递,即
PostMessage(m_hWnd,WM_COMMNOTIFY,(WPARAM)hCommDev,NULL);
中因为没了m_hWnd怎么办?或者能用其它办法解决吗?
...全文
55 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shangguohua 2003-07-16
  • 打赏
  • 举报
回复
楼上的大哥,你可能没看清楚我的前提条件:线程没有窗体!!!!!
而有系统默认的情况下,线程调用一个Win 32 USER或GDI函数时,系统才创建线程
的消息队列。而接收线程没有消息队列,PostThreadMessage肯定失败,
不过问题已解决:
就是消息目的线程调用PeedMessage(£msg,NULL,WM_USER,WM_USER,PM_NOREMOVE)来强制系统创建消息队列。
flyccloud 2003-07-15
  • 打赏
  • 举报
回复
回调函数,也行
wangbab 2003-07-15
  • 打赏
  • 举报
回复
PostThreadMessaege()

通过线程ID发消息
jack_wq 2003-07-15
  • 打赏
  • 举报
回复
VB没用过!^_^
papaya_stone 2003-07-15
  • 打赏
  • 举报
回复
把WM_COMMNOTIFY消息发给VB程序(主程序),然后它在调用dll中的导出函数OnCommRecvNotify
wangbab 2003-07-15
  • 打赏
  • 举报
回复
我试了一下,通过PostThreadMessage发送的消息可以由GetMessage截获
我的测试
#define MY_QUIT WM_USER+100
UINT TestThread(LPVOID pParam)
{
MSG msg;
int n=1;
while(n){
while(::GetMessage(&msg,NULL,0,0)){
if(msg.message==MY_QUIT){
n=0;
break;
}
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
AfxMessageBox("线程结束");
return 0L;
}

开始线程
CWinThread *pThread=AfxBeginThread(TestThread,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
DWORD ThreadId=pThread->m_nThreadId;
::PostThreadMessage(ThreadId,MY_QUIT,0,0);

测试通过。
shangguohua 2003-07-15
  • 打赏
  • 举报
回复
在DLL内部如果主线程不产生窗体的话,就没法来传递消息了吗?救命啊!

to:wangbab(bab)
大哥,用postthreadMessage()我在没有窗体的情况下怎么才能收到消息啊,用GetMessage吗?可它好像只能用来取出窗体的消息啊!
hWnd:取得其消息的窗口的句柄。这是一个有特殊含义的值(NULL)。GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。

2.14.4 GetMessage

函数功能:该函数从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。GetMessage不接收属于其他线程或应用程序的消息。
函数原型:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilteMax
参数:
lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。这是一个有特殊含义的值(NULL)。GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。
返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是_1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。
备注:应用程序通常用返回值来确定是否终止主消息循环并退出程序。
GetMesssge只接收与参数hWnd标识的窗口或子窗口相联系的消息,子窗口由函数IsChild决定,消息值的范围由参数wMsgFilterMin和wMsgFilterMax给出。如果hWnd为NULL,则GetMessage接收属于调用线程的窗口的消息,线程消息由函数PostThreadMessage寄送给调用线程。GetMessage不接收属于其他线程或其他线程的窗口的消息,即使hWnd为NULL。由PostThreadMessage寄送的线程消息,其消息hWnd值为NULL。如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。
常数 WM_KEYFIRST和WM_KEYAST可作为过滤值取得与键盘输入相关的所有消息:常数WM_MOUSEFIRST和WM_MOUSELST可用来接收所有的鼠标消息。如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。
GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕。
注意,此函数的返回值可非零、零或-1,应避免如下代码出现:
while(GetMessage(IpMsg,hwnd,0,0))…
-1返回值的可能性表示这样的代码会导致致命的应用程序错误。
速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本:头文件:winuser.h;输入库:user32.Iib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。
shangguohua 2003-07-15
  • 打赏
  • 举报
回复
这里引用Jeffrey Richter的《Windows高级编程指南》P370:
“11.2.2 向线程的消息队列投递消息
在Win32中,当线程开始被创建时,它被认为是一个工作者线程,即系统试图不偏不斜地
对待它。但一旦当开始调用用户或GDI函数时,它就成为用户界面线程。用户界面线程需要
额外的开销,如THREADINFO结构等。换句话说,线程在调用第一个用户或GDI函数之前,没有
相关的THREADINFO结构。”
一旦线程有了相关的THREADINFO结构,它就有了自己的消息队列集。”

看了上面的话,我就怀疑没有调用创建窗口时的线程就没有THREADINFO结构,我刚学没试过
那么用PostThreadMessage()它能接收到吗?请那位大哥帮我解释一下好吗?上面的第一个用
户指的是什么?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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