这是我钩子DLL中向外部进程传递消息的函数,当钩子被注入后这段会被执行,但接收消息的进程收不到它发出的消息。 后来我测试把这个函数放在一个MFC EXE中,就可以用。 请问在DLL中发消息是不是有什么限制,或者我哪里做错了。谢谢各位指教!
BOOL SendIpcMsg() 
{
//CWnd *pWnd=CWnd::FindWindow(NULL,"Receiver"); 
CString strWindowTitle = _T("Receiver");
    CString strDataToSend  = _T("This is a message to send");
    
LRESULT copyDataResult;
CWnd *pOtherWnd = CWnd::FindWindow(NULL, strWindowTitle); if (pOtherWnd)
{
COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = strDataToSend.GetLength();
cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData);
copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,
                                                (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),
                                                (LPARAM)&cpd);
strDataToSend.ReleaseBuffer();
// copyDataResult has value returned by other app


else 
{
AfxMessageBox("Unable to find other app.");
}
return FALSE;
}

解决方案 »

  1.   

    我遇过这样的问题,在DLL中PostMessage()给别的进程没问题,SendMessage()时对方收不到。你试试用PostMessage()行不行。记得处理同步。
      

  2.   

    我猜是WM_COPYDATA消息有问题。当在同一个进程的时候,此消息时可以完全被操作的。但是,此消息在多进程的环境下会出问题。我记得在哪篇文章中说道,MS为了安全性,至少在XP中提高了对此类消息的控制,不允许在多进程中发送WM_COPYDATA的消息。好像还包括WM_GETTEXT等。不过我具体的没有试验过。
      

  3.   

    icelight(icelight) ,WM_COPYDATA不能用PostMessage的。
    另外,楼上说得也许有道理。
      

  4.   

    我没有特别指哪一个消息。
    我没留意到楼主在说WM_COPYDATA,不好意思。我是在用LPARAM传一个字符串指针时遇到类似情况。