WSAAsyncSelect模型的使用

xiaodong60606 2014-01-21 05:11:42
我启动一个线程,在线程里面启动TCP服务器,启动线程的时候没有把窗口句柄传输进去。
HWND hWnd=AfxGetMainWnd()->GetSafeHwnd();
if(SOCKET_ERROR==WSAAsyncSelect(m_SockSrv,hWnd,WM_SOCKET,FD_ACCEPT|FD_READ|FD_WRITE))
{
return;
}
这样写行不行?为什么捕获不到消息?谢谢。
因为我写的是一个动态链接库,上层程序没有把窗口句柄传输进来,所以不知道WSAAsyncSelect的第二个参数写什么,谢谢。
...全文
135 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
brk1985 2014-01-22
  • 打赏
  • 举报
回复
引用 12 楼 xiaodong60606 的回复:
[quote=引用 10 楼 brk1985 的回复:] [quote=引用 9 楼 xiaodong60606 的回复:] [quote=引用 8 楼 brk1985 的回复:] [quote=引用 7 楼 xiaodong60606 的回复:] [quote=引用 6 楼 brk1985 的回复:] [quote=引用 5 楼 brk1985 的回复:] [quote=引用 4 楼 xiaodong60606 的回复:] [quote=引用 3 楼 brk1985 的回复:] [quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。[/quote] 那你在哪个窗口监听呢?AfxGetMainWnd()作用是获得主窗口指针,如果是基于对话框的MFC程序,转换成CXXXDlg指针。。。[/quote] 补充下: 你自定义了WM_SOCKET消息,这个消息的响应函数OnSocket定义在哪个窗口?定义在哪个窗口,就写哪个窗口的句柄。。。[/quote] 我新建一个线程类,继承CWinThread,在我这个线程类里面定义的WM_SOCKET消息,在这个线程类的run里面写的WSAAsyncSelect(),这样行不行?怎么得到hWnd,谢谢。[/quote] CWinThread *pThreadPerInfo = AfxBeginThread(RUNTIME_CLASS(CUserThread)); Sleep(2000); pThreadPerInfo->m_pMainWnd->PostMessage(WM_USER+1); 参考下这个写法。。。 你在线程类里的话,填上m_pMainWnd应该就行了,你测试下看看行不行?[/quote] 我现在写的是WSAAsyncSelect异步通信的程序,目前不知道怎么写第二个参数?整个SOCKET都在一个线程类的run()里面,包括bind,listen,写WSAAsyncSelect的时候不知道参数怎么写,谢谢。[/quote] brk1985@163.com多多交流。。。 m_pMainWnd是CWinThread类句柄,用上还是不行?
xiaodong60606 2014-01-22
  • 打赏
  • 举报
回复
引用 10 楼 brk1985 的回复:
[quote=引用 9 楼 xiaodong60606 的回复:] [quote=引用 8 楼 brk1985 的回复:] [quote=引用 7 楼 xiaodong60606 的回复:] [quote=引用 6 楼 brk1985 的回复:] [quote=引用 5 楼 brk1985 的回复:] [quote=引用 4 楼 xiaodong60606 的回复:] [quote=引用 3 楼 brk1985 的回复:] [quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。[/quote] 那你在哪个窗口监听呢?AfxGetMainWnd()作用是获得主窗口指针,如果是基于对话框的MFC程序,转换成CXXXDlg指针。。。[/quote] 补充下: 你自定义了WM_SOCKET消息,这个消息的响应函数OnSocket定义在哪个窗口?定义在哪个窗口,就写哪个窗口的句柄。。。[/quote] 我新建一个线程类,继承CWinThread,在我这个线程类里面定义的WM_SOCKET消息,在这个线程类的run里面写的WSAAsyncSelect(),这样行不行?怎么得到hWnd,谢谢。[/quote] CWinThread *pThreadPerInfo = AfxBeginThread(RUNTIME_CLASS(CUserThread)); Sleep(2000); pThreadPerInfo->m_pMainWnd->PostMessage(WM_USER+1); 参考下这个写法。。。 你在线程类里的话,填上m_pMainWnd应该就行了,你测试下看看行不行?[/quote] 我现在写的是WSAAsyncSelect异步通信的程序,目前不知道怎么写第二个参数?整个SOCKET都在一个线程类的run()里面,包括bind,listen,写WSAAsyncSelect的时候不知道参数怎么写,谢谢。[/quote] m_pMainWnd是CWinThread类句柄,用上还是不行? ps:如果可以,可以把代码发我,我调调看,目前公司事情比较少,也想学点新知识。。。[/quote] 留下邮箱
这个娜戒海了 2014-01-22
  • 打赏
  • 举报
回复
不在一个线程的里面的话,AfxGetMainWnd是获取不到的 建议用AfxGetApp 或者你写一个接口,让调用者手动得把主框架对话框指针传进来就行了
brk1985 2014-01-22
  • 打赏
  • 举报
回复
引用 9 楼 xiaodong60606 的回复:
[quote=引用 8 楼 brk1985 的回复:] [quote=引用 7 楼 xiaodong60606 的回复:] [quote=引用 6 楼 brk1985 的回复:] [quote=引用 5 楼 brk1985 的回复:] [quote=引用 4 楼 xiaodong60606 的回复:] [quote=引用 3 楼 brk1985 的回复:] [quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。[/quote] 那你在哪个窗口监听呢?AfxGetMainWnd()作用是获得主窗口指针,如果是基于对话框的MFC程序,转换成CXXXDlg指针。。。[/quote] 补充下: 你自定义了WM_SOCKET消息,这个消息的响应函数OnSocket定义在哪个窗口?定义在哪个窗口,就写哪个窗口的句柄。。。[/quote] 我新建一个线程类,继承CWinThread,在我这个线程类里面定义的WM_SOCKET消息,在这个线程类的run里面写的WSAAsyncSelect(),这样行不行?怎么得到hWnd,谢谢。[/quote] CWinThread *pThreadPerInfo = AfxBeginThread(RUNTIME_CLASS(CUserThread)); Sleep(2000); pThreadPerInfo->m_pMainWnd->PostMessage(WM_USER+1); 参考下这个写法。。。 你在线程类里的话,填上m_pMainWnd应该就行了,你测试下看看行不行?[/quote] 我现在写的是WSAAsyncSelect异步通信的程序,目前不知道怎么写第二个参数?整个SOCKET都在一个线程类的run()里面,包括bind,listen,写WSAAsyncSelect的时候不知道参数怎么写,谢谢。[/quote] m_pMainWnd是CWinThread类句柄,用上还是不行? ps:如果可以,可以把代码发我,我调调看,目前公司事情比较少,也想学点新知识。。。
xiaodong60606 2014-01-22
  • 打赏
  • 举报
回复
引用 8 楼 brk1985 的回复:
[quote=引用 7 楼 xiaodong60606 的回复:] [quote=引用 6 楼 brk1985 的回复:] [quote=引用 5 楼 brk1985 的回复:] [quote=引用 4 楼 xiaodong60606 的回复:] [quote=引用 3 楼 brk1985 的回复:] [quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。[/quote] 那你在哪个窗口监听呢?AfxGetMainWnd()作用是获得主窗口指针,如果是基于对话框的MFC程序,转换成CXXXDlg指针。。。[/quote] 补充下: 你自定义了WM_SOCKET消息,这个消息的响应函数OnSocket定义在哪个窗口?定义在哪个窗口,就写哪个窗口的句柄。。。[/quote] 我新建一个线程类,继承CWinThread,在我这个线程类里面定义的WM_SOCKET消息,在这个线程类的run里面写的WSAAsyncSelect(),这样行不行?怎么得到hWnd,谢谢。[/quote] CWinThread *pThreadPerInfo = AfxBeginThread(RUNTIME_CLASS(CUserThread)); Sleep(2000); pThreadPerInfo->m_pMainWnd->PostMessage(WM_USER+1); 参考下这个写法。。。 你在线程类里的话,填上m_pMainWnd应该就行了,你测试下看看行不行?[/quote] 我现在写的是WSAAsyncSelect异步通信的程序,目前不知道怎么写第二个参数?整个SOCKET都在一个线程类的run()里面,包括bind,listen,写WSAAsyncSelect的时候不知道参数怎么写,谢谢。
brk1985 2014-01-22
  • 打赏
  • 举报
回复
引用 7 楼 xiaodong60606 的回复:
[quote=引用 6 楼 brk1985 的回复:] [quote=引用 5 楼 brk1985 的回复:] [quote=引用 4 楼 xiaodong60606 的回复:] [quote=引用 3 楼 brk1985 的回复:] [quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。[/quote] 那你在哪个窗口监听呢?AfxGetMainWnd()作用是获得主窗口指针,如果是基于对话框的MFC程序,转换成CXXXDlg指针。。。[/quote] 补充下: 你自定义了WM_SOCKET消息,这个消息的响应函数OnSocket定义在哪个窗口?定义在哪个窗口,就写哪个窗口的句柄。。。[/quote] 我新建一个线程类,继承CWinThread,在我这个线程类里面定义的WM_SOCKET消息,在这个线程类的run里面写的WSAAsyncSelect(),这样行不行?怎么得到hWnd,谢谢。[/quote] CWinThread *pThreadPerInfo = AfxBeginThread(RUNTIME_CLASS(CUserThread)); Sleep(2000); pThreadPerInfo->m_pMainWnd->PostMessage(WM_USER+1); 参考下这个写法。。。 你在线程类里的话,填上m_pMainWnd应该就行了,你测试下看看行不行?
xiaodong60606 2014-01-22
  • 打赏
  • 举报
回复
引用 6 楼 brk1985 的回复:
[quote=引用 5 楼 brk1985 的回复:] [quote=引用 4 楼 xiaodong60606 的回复:] [quote=引用 3 楼 brk1985 的回复:] [quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。[/quote] 那你在哪个窗口监听呢?AfxGetMainWnd()作用是获得主窗口指针,如果是基于对话框的MFC程序,转换成CXXXDlg指针。。。[/quote] 补充下: 你自定义了WM_SOCKET消息,这个消息的响应函数OnSocket定义在哪个窗口?定义在哪个窗口,就写哪个窗口的句柄。。。[/quote] 我新建一个线程类,继承CWinThread,在我这个线程类里面定义的WM_SOCKET消息,在这个线程类的run里面写的WSAAsyncSelect(),这样行不行?怎么得到hWnd,谢谢。
brk1985 2014-01-22
  • 打赏
  • 举报
回复
引用 5 楼 brk1985 的回复:
[quote=引用 4 楼 xiaodong60606 的回复:] [quote=引用 3 楼 brk1985 的回复:] [quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。[/quote] 那你在哪个窗口监听呢?AfxGetMainWnd()作用是获得主窗口指针,如果是基于对话框的MFC程序,转换成CXXXDlg指针。。。[/quote] 补充下: 你自定义了WM_SOCKET消息,这个消息的响应函数OnSocket定义在哪个窗口?定义在哪个窗口,就写哪个窗口的句柄。。。
brk1985 2014-01-22
  • 打赏
  • 举报
回复
引用 4 楼 xiaodong60606 的回复:
[quote=引用 3 楼 brk1985 的回复:] [quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。[/quote] 那你在哪个窗口监听呢?AfxGetMainWnd()作用是获得主窗口指针,如果是基于对话框的MFC程序,转换成CXXXDlg指针。。。
xiaodong60606 2014-01-22
  • 打赏
  • 举报
回复
引用 3 楼 brk1985 的回复:
[quote=引用 2 楼 xiaodong60606 的回复:] 我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*[/quote] 我写的是一个动态链接库,上层程序没有给我CXXXDlg,我根本就不知道CXXXDlg,怎么办?谢谢。我直接启动了一个线程,继承CWinThread,在这个里面用WSAAsyncSelect,第二个参数写什么?谢谢。
brk1985 2014-01-22
  • 打赏
  • 举报
回复
引用 2 楼 xiaodong60606 的回复:
我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。 [quote=引用 1 楼 brk1985 的回复:] 这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
[/quote] 这样看看,HWND hWnd= (CXXXDlg*)AfxGetMainWnd()->GetSafeHwnd(); 查了下以前的资料,是要做强制转换的,AfxGetMainWnd()返回值是CWnd*
xiaodong60606 2014-01-22
  • 打赏
  • 举报
回复
我的这个类是继承的CWinThread,里面没有m_hWnd这个变量,怎么办?谢谢。
引用 1 楼 brk1985 的回复:
这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
brk1985 2014-01-22
  • 打赏
  • 举报
回复
这样不行?应该可以的吧,奇怪。。。主对话框句柄就是这样获得的啊。之前我是用m_hWnd,可以监听到事件的。 改成m_hWnd试试看
brk1985 2014-01-22
  • 打赏
  • 举报
回复
测试蛮久,发现线程类里可以使用WSAAsyncSelect,第二个参数是窗口句柄,WM_SOCKET的响应函数必须在窗口类中(CTCPDlg)定义。。。线程类的m_pMainWnd保存的是窗口类指针,你线程在CTCPDlg类中开启,保存的是CTCPDlg指针。。。

15,471

社区成员

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

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