2009-05-29 5 views
2

Je tire mes cheveux sur celui-ci. J'essaye d'envoyer un message à une fenêtre dans un autre processus. Je continue d'obtenir accès refusé (0x5) à partir GetLastError() après avoir appelé SendMessage ou PostMessage ou PostThreadMessage. J'ai essayé d'éteindre l'UAC. J'ai également pris en compte UIPI en veillant à ce que les niveaux d'intégrité correspondent à travers les processus. (J'ai vérifié avec Process Explorer de SysInternals, maintenant MS) J'ai également désactivé Windows Defender sans aucune chance. Je peux envoyer un message à la fenêtre de l'intérieur du processus très bien, mais de l'extérieur, je reçois bupkus! Cela semble être une sorte de problème de sécurité, mais je ne sais pas ce qu'il est que les deux processus ont le même niveau d'intégrité (moyenne - décimale 8192)SendMessage de DLL à une fenêtre dans un autre processus dans Vista

code de DLL envoyer le message

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

code sélectionné de recevant la fenêtre

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

Les deux applications fonctionnent-elles comme des applications de bureau? Ou est-ce que l'un d'entre eux est un service ou fonctionne sous une session différente? – jdigital

+0

Est-ce que le pseudo-code ci-dessus? Parce que ça a l'air erroné; comment pouvez-vous utiliser MsgCode dans la carte de message AVANT qu'il est initialisé dans le constructeur? Je ne suis pas expert en MFC, mais c'est peut-être le problème? – beef2k

+0

L'explorateur de processus indique que les deux s'exécutent dans la session 1. La section de code supérieure s'exécute dans une DLL qui a été injectée dans un autre processus avec un hook WH_CALLWNDPROC. Je pense que je peux utiliser MsgCode dans la carte des messages avec ON_REGISTERED_MESSAGE et pas tout à fait vieux ON_MESSAGE. Cette carte de message fonctionne avec un appel sendmessage à l'intérieur du processus mais pas à partir de la DLL injectée. – JohnG

Répondre

2

Est-ce que ce doit être un message? Il y a beaucoup de façons de communication entre les différents processus:

  • Pipes
  • Prises
  • mémoire partagée
  • Fichiers
+1

Je pense que je devrais aller avec une de ces options si je ne peux pas obtenir ceci pour fonctionner. Je ne voulais pas m'engager pour une si petite notification. – JohnG

+0

Les tuyaux sont en fait assez simples à mettre en œuvre. Probablement le meilleur choix pour votre problème. – beef2k

2

On dirait qu'il est un cas d'isolement de privilège de l'interface utilisateur (UIPI) (Si votre DLL est chargée dans un autre processus)

Utilisez ChangeWindowMessageFilterEx sur le processus de réception. J'espère que cela fonctionnera

Questions connexes