none
SendMessage返回1400错误(无效的窗口句柄) RRS feed

  • 问题

  • 进程A和B都需要向进程C通过WM_COPYDATA发送消息,C的句柄HWND在启动时存储于数据中以供A和B获取。

    A和B发送消息方法如下

    LRESULT result = ::SendMessage(hProxyWnd, WM_COPYDATA, (WPARAM) 0, (LPARAM) &strctToPass);

    但是A能够顺利将信息发送到C,但是B却不能,通过WSAGetLastError ()发现返回的都是1400错误代码,即无效的窗口句柄,但是B的句柄和A获取的是一模一样的,为何A能发送成功而B不能?

    这个问题比较挠头,大家有没有比较好的思路来调试/解决这个问题。

    不胜感激!

    2010年9月1日 3:14

答案

  • 任务管理器里面可以看到,sessionID列默认不显示,需要手动添加

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Eazhang 2010年9月2日 6:40
    2010年9月2日 6:16
    版主

全部回复

  • HWND只在当前session有效。检查你的进程是否在同一个桌面。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月1日 3:53
    版主
  • 是在同一个桌面的,Spy++可以看到,只是没有title罢了
    2010年9月1日 4:27
  • 用GetLastError看看,WSAGetLastError 是socket的,和你的问题没关系

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月1日 4:30
    版主
  • 恩,谢谢。还是1400.

     

    补充一下, 进程A和B的区别在于

    A被部署为DLL于MSSQL\Binn, SQL Server通过扩展存储过程调用了A中的API,而B是被注册为Windows服务。

    2010年9月1日 5:00
  • 服务和桌面程序不是在一个桌面上,你不能在桌面程序和服务程序之间共享窗口句柄。用RPC、Socket、命名管道之类可以跨session的通讯方式吧。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月1日 5:36
    版主
  • 如果服务设置了“Allow service to interact with desktop”-- 允许与桌面交互,那么桌面应用程序是否可以和服务共享窗口句柄?

    谢谢!

    2010年9月2日 0:58
  • 可能可以,取决于桌面应用程序的session是不是和服务的session一致。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月2日 1:13
    版主
  • 最好还是用跨进程的方式来收发数据吧,用CreatePipe建立实名管道通信,这样比较简单
    0xBAADF00D
    2010年9月2日 1:34
    版主
  • 关于您的是否同一个session的问题,我找到一篇文章

    http://blog.csdn.net/qinlicang/archive/2009/07/17/4356662.aspx

    我是同一个用户登录系统启动服务运行程序,这两者应该是同一个session吧?

    谢谢!

    2010年9月2日 2:31
  • 嗯,如果是第一个从物理终端登录的用户的话,是的

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月2日 3:02
    版主
  • 很谢谢Vonger和Sheng Jiang的建议。

    采用其他的方法是可以实现进程间通信,但是既然同一个物理终端,服务又允许和桌面交互,为何应用程序无法向服务发送信息,返回无效句柄的错误,有点挠头,但是还想找出最终的答案。

    谢谢!

    2010年9月2日 3:07
  • HWND只在当前session有效。同一个用户可以登录多个session。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月2日 3:21
    版主
  • 请教如何查看windows中的session?如何判断服务的应用程序各自所在的session?

    谢谢!

    2010年9月2日 5:36
  • 任务管理器里面可以看到,sessionID列默认不显示,需要手动添加

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Eazhang 2010年9月2日 6:40
    2010年9月2日 6:16
    版主
  • 恩是的

    服务的session ID是0,而应用程序的1,怪不得不能共享句柄

    2010年9月2日 6:41