2015-11-21 1 views
0

J'ai deux applications qui utilisent une DLL commune. De l'application « A » J'ai envoyé un message avec le paramètre de chaîne comme indiqué ci-dessousEnvoyer une chaîne via SendMessage depuis l'intérieur dll

txt := 'Test String' 
SendMessage(Handle, MyMessage, 0, lParam(PChar(txt))); 

et dans la même DLL J'ai une autre fonction pour lire ce message, mais j'ai reçu un message vide. Je ne sais pas où je fais erreur.

procedure MyClass.WndMethod(var Msg: TMessage); 
var 
    Str: string; 
begin 
    case Msg.Msg of 
    MyMessage: 
    begin 
     Str := string(PChar(Msg.LParam)); 
     ShowMessage(Str); // Empty message 
    end; 
end; 
+0

Est-il applicable d'utiliser 'WM_COPYDATA' comme décrit ici http://stackoverflow.com/questions/10126342/vc-sending-message-between-two-application? – SevenEleven

+0

@SevenEleven Je l'ai fait aussi bien mais j'ai reçu un message vide. –

Répondre

1

Vous envoyez un message privé entre les processus. le système ne marshal pas les données d'un processus à l'autre. Cela est nécessaire parce que les processus ont des espaces d'adresses virtuelles isolées privées.

Vous envoyez un pointeur, une adresse à la mémoire dans le processus d'envoi. Cette adresse est reçue, mais elle n'est d'aucune utilité parce que le processus de réception ne peut pas accéder à la mémoire du processus d'envoi. D'où la nécessité de rassembler les données entre les processus.

Si vous souhaitez rassembler des données entre des processus utilisant des messages, vous devez utiliser le message WM_COPYDATA.

+0

Mais je peux facilement passer des valeurs entières, le problème vient en valeurs de chaîne. –

+0

C'est vrai. Vous pouvez également passer un pointeur. C'est juste que cela fait référence à la mémoire dans l'espace d'adressage de l'expéditeur, que le destinataire ne peut pas voir. Avez-vous suivi le lien dans ma réponse. –

+0

merci @David Heffernan –