2009-07-06 4 views
2

Je rencontre un problème avec le contenu d'un pointeur transmis car le wParam d'une application C# 32 bits est en cours de modification vers un processus C++ 64 bits.Paramètres PostMessage de C# à 32 bits C++

Il existe deux processus 32.exe (en C#) et 64.exe (en C++). 64.exe est démarré en tant que processus fils de 32.exe. Message de la fenêtre de publication 32.exe pour 64.exe, dont l'un a un wParam qui est un pointeur vers un tableau de structures RECT. Les deux 64.exe et 32.exe ont un DLL commun (écrit en C++, mais compilé pour différentes plates-formes, bien sûr), appelé 32.dll et 64.dll.

Une fonction qui attend un RECT * dans 32.dll est appelée directement à partir de 32.exe avec le même RECT * qui est postée ultérieurement, et cela fonctionne bien. Ensuite, il affiche un message à 64.exe, qui appelle la même fonction et jette le wParam à rect *:

else if (WM_SetDisabledAreas == message) 
{ 
    SetDisabledAreas((RECT*)wParam, (UINT)lParam); 
} 

Le message est affiché comme suit:

if (Is64Bit() && SubProcess64 != null) 
    { 
     Win32.PostMessage(SubProcess64.MainWindowHandle, WindowMessages.SetDisabledAreas, 
      (uint)pointer.ToInt32(), length); 
    } 
    MessageBox.Show(pointer.ToString()); 
    DLL32.SetDisabledAreas(pointer, length); 

Par débogage J'ai validé que le message est reçu, mais l'adresse wParam n'est pas la même qu'avant. Ce n'est pas inattendu, mais le contenu de la mémoire vers laquelle il pointe maintenant est indéfini (et j'obtiens une violation d'accès en essayant de voir ce qui est là).

Que se passe-t-il ici?

+0

Pouvez-vous ajouter une source qui inclut comment votre variable de pointeur est initialisée? – Jason

+0

Exactement comme dans cette question: http://stackoverflow.com/questions/1086294/convert-array-of-structs-to-intptr –

+0

Le problème se produit si vous utilisez SendMessage? – Jason

Répondre

5

Chacun des deux processus possède son propre espace d'adressage, de sorte que le pointeur du processus 32.exe n'est pas valide dans 64.exe.

Cependant, cela n'a rien à voir avec 32 bits vs 64 bits du tout. Il suffit d'utiliser une technique de communication interprocess de votre choix pour transférer les données entre les deux processus.

Par exemple, vous pouvez utiliser CreateFileMapping pour créer une section nommée de la mémoire partagée.

+0

Je sais qu'ils peuvent avoir des espaces d'adressage différents, mais Windows n'est-il pas supposé traduire cela pour vous lorsque vous passez des pointeurs? –

+0

Comment les fenêtres doivent-elles savoir que le pointeur (uint) .ToInt32() est un pointeur vers un tableau de rectangles? Et comment devrait-il connaître la longueur de ce tableau quand l'appeler? – Timbo

+0

Windows effectue la traduction pour vous pour les messages dont il a connaissance. Pour les messages personnalisés, il n'a aucune idée de ce que sont les données, donc il ne fait que transmettre les valeurs et ne leur fait rien. – Andy

Questions connexes