【问题标题】:SendMessage from DLL to a window in another process in Vista从 DLL 向 Vista 中另一个进程中的窗口发送消息
【发布时间】:2010-10-29 18:45:04
【问题描述】:

我正在把头发拉出来。我正在尝试向另一个进程中的窗口发送消息。在调用 SendMessage 或 PostMessage 或 PostThreadMessage 后,我不断从 GetLastError() 获得访问被拒绝 (0x5)。我试过关闭UAC。我还通过确保完整性级别与跨进程匹配来说明 UIPI。 (我使用 SysInternals 的 Process Explorer 进行了检查,现在是 MS)我也关闭了 Windows Defender,但没有运气。我可以从进程内部向窗口发送消息就好了,但是从外部我得到了bupkus!这似乎是某种安全问题,但我不知道它是什么,因为两个进程具有相同的完整性级别(中 - 十进制 8192)

来自 DLL 的代码发送消息

UINT MsgCode = ::RegisterWindowMessage(_T("MESSAGE_CODING_STRING"));
::ChangeWindowMessageFilter(MsgCode,MSGFLT_ADD);
::PostMessage(hwnd1,MsgCode,(WPARAM)1,(LPARAM)1);
DWORD errorcode = ::GetLastError();

从接收窗口中选择的代码

BEGIN_MESSAGE_MAP(CMessageMailBox, CDialog)
    ON_REGISTERED_MESSAGE(MsgCode, TextFromApp)
END_MESSAGE_MAP()

// Class Constructor    
CMessageMailBox::CMessageMailBox(CWnd* pParent /*=NULL*/)
        : CDialog(CMessageMailBox::IDD, pParent){
       MsgCode = ::RegisterWindowMessage(_T("MESSAGE_CODING_STRING"));
       ::ChangeWindowMessageFilter(MsgCode,MSGFLT_ADD);
    }

//Message Handler   
    afx_msg LRESULT CMessageMailBox::TextFromApp(WPARAM wParam,LPARAM lParam){
        ::MessageBox(NULL,L"message recieved",L"yea!",MB_OK);
        return 0L;
    }

【问题讨论】:

  • 两个应用程序都作为桌面应用程序运行吗?或者其中一个是服务还是在不同的会话下运行?
  • 以上是伪代码吗?因为它看起来是错误的;在构造函数中初始化之前,如何在消息映射中使用 MsgCode?我不是 MFC 专家,但也许这就是问题所在?
  • 重新阅读 Petzold 之后,我意识到我错了:窗口句柄是系统范围的,所以你可以传递数字。鉴于此,出于某种原因,UIPI 听起来仍然是问题所在。你能在 XP 上试试这个代码,看看它是否在那里工作?
  • 接收消息的进程必须是调用 ChangeWindowMessageFilter() 的进程,以允许接收消息。从试图发送消息的 DLL 调用它不会解除接收进程中的消息阻塞。另外,您确定来自 GetLastError() 的错误实际上与 PostMessage() 相关,而不是一些早期的 API 调用?如果 PostMessage() 不返回 FALSE,则在 PostMessage() 之后调用 GetLastError() 没有意义。
  • 另外,您是否首先检查以确保 ChangeWindowMessageFilter() 成功?

标签: c++ winapi windows-vista sendmessage uipi


【解决方案1】:

必须是消息吗?不同进程之间有多种通信方式:

  • 管道
  • 套接字
  • 共享内存
  • 文件

【讨论】:

  • 我想如果我不能让它工作,我将不得不选择其中一个选项。我不想为了这么小的通知而麻烦。
  • 管道实际上很容易实现。可能是您解决问题的最佳选择。
【解决方案2】:

看起来这是用户界面特权隔离 (UIPI) 的情况(也就是说,如果您的 DLL 被加载到另一个进程)

在接收过程中使用ChangeWindowMessageFilterEx。我希望它会工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多