2009-05-29 6 views
2

Ich ziehe meine Haare aus diesem heraus. Ich versuche, in einem anderen Prozess eine Nachricht an ein Fenster zu senden. Ich erhalte nach dem Aufruf von SendMessage oder PostMessage oder PostThreadMessage immer den Zugriff verweigert (0x5) von GetLastError(). Ich habe versucht, UAC auszuschalten. Ich habe auch UIPI berücksichtigt, indem ich sichergestellt habe, dass die Integritätslevel übergreifend übereinstimmen. (Ich habe mit Process Explorer von SysInternals, jetzt MS) überprüft. Ich habe Windows Defender auch ohne Glück abgeschaltet. Ich kann eine Nachricht aus dem Prozess in das Fenster senden, aber von draußen bekomme ich bupkus! Dies scheint wie eine Art von Sicherheitsproblem, aber ich habe keine Ahnung, was es ist, da beide Prozesse die gleiche Integrity Level haben (mittel - dezimal 8192)SendMessage von DLL zu einem Fenster in einem anderen Prozess in Vista

-Code von DLL die Meldung

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

ausgewählten Code Senden von Empfangen des Fensters

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; 
    } 
+0

Werden beide Apps als Desktop-Apps ausgeführt? Oder ist einer von ihnen ein Service oder läuft er in einer anderen Sitzung? – jdigital

+0

Ist der obige Pseudocode? Weil es falsch aussieht; Wie können Sie MsgCode in der Nachrichtenzuordnung verwenden, BEVOR es im Konstruktor initialisiert wird? Ich bin kein Experte für MFC, aber vielleicht ist das das Problem? – beef2k

+0

Process Explorer gibt an, dass beide in Sitzung 1 ausgeführt werden. Der oberste Codeabschnitt wird in einer DLL ausgeführt, die in einen anderen Prozess mit einem WH_CALLWNDPROC-Hook injiziert wurde. Ich denke, ich kann MsgCode in der Nachrichtenzuordnung mit ON_REGISTERED_MESSAGE und nicht einfach alt ON_MESSAGE verwenden. Diese Nachrichtenzuordnung funktioniert mit einem sendmessage-Aufruf von innerhalb des Prozesses, aber nicht von der injizierten DLL. – JohnG

Antwort

2

Muss es eine Nachricht sein? Es gibt viele Möglichkeiten, um die Kommunikation zwischen verschiedenen Prozessen:

  • Pipes
  • Sockets
  • Shared Memory
  • Dateien
+1

Ich denke, ich werde mit einer dieser Optionen gehen müssen, wenn ich das nicht zur Arbeit bringen kann. Ich wollte mich nicht für eine so kleine Benachrichtigung bemühen. – JohnG

+0

Rohre sind eigentlich ziemlich einfach zu implementieren. Wahrscheinlich die beste Wahl für Ihr Problem. – beef2k

2

Sieht aus wie es ein Fall von User Interface Privilege Isolation ist (UIPI) (Das heißt, wenn Ihre DLL in einen anderen Prozess geladen wird)

Verwenden Sie ChangeWindowMessageFilterEx auf der Empfangsprozess. Ich hoffe, es wird funktionieren

Verwandte Themen