2010-10-06 6 views
0

Bonjour, je rencontre des problèmes avec mon SendMessage. Il semble que le message n'atteigne jamais ma forme (j'utilise Winspector Spy pour voir quels messages sont enregistrés dans mon formulaire), ce qui est étrange parce que je suis shure que j'envoie au bon handle pour le Forme actuelle.Problèmes avec IPC SendMessage

Le SendMessage est dans une DLL mais cela ne devrait rien avoir à faire avec.

//sStr is just an input where i type in the Handler address; 
SendMessage(Integer(sStr),WM_COPYDATA, Integer(Handle),Integer(@copyDataStruct)); 

SendMessage renvoie 0 à chaque fois.

A la réception:

procedure WMCopyData(var Msg: TWMCopyData); message WM_CopyData; 

procedure TMainForm.WMCopyData(var Msg: TWMCopyData); 
var 
s : string; 
begin 
    s := PChar(Msg.CopyDataStruct.lpData); 
    showmessage(s); 
//Send something back 
    msg.Result := 2006; 
end; 

J'ai aussi essayé d'autres messages comme WM_CLOSE. Est-ce que quelqu'un sait pourquoi cela échoue? J'utilise Delphi 5.

+0

Etes-vous sûr que vous passez la poignée de fenêtre de droite à SendMessage? Veuillez vérifier cela en premier. Et je suppose que c'est une application de formulaires normale. – Runner

Répondre

1

Le problème est que vous ne pouvez pas écrire

Integer(sStr) 

pour convertir une chaîne représentant un nombre entier (par exemple '12345') à un nombre entier (12 345).

Utilisez

StrToInt(sStr) 

à la place.

En effet, techniquement, une chaîne n'est qu'un pointeur sur l'en-tête de chaîne + les données. Je suppose que Integer(sStr) renvoie simplement ce pointeur. (Ou, en fait, traite simplement le sStr comme un entier).

C'est, vous devriez faire

SendMessage(StrToInt(sStr), WM_COPYDATA, Handle, cardinal(@copyDataStruct)); 
+0

N'a pas aidé, mais merci pour la suggestion – Roise

+0

Eh bien, c'est plus qu'une suggestion. Il ne fonctionnera * certainement * pas si vous écrivez 'Integer (sStr)'. Quand j'ai fait un test, 'Integer ('12345') = 4605000'. –

+0

Oui bien je l'utilise, désolé si je sonne forte ou n'a pas pris ce que vous avez dit, im juste dire que cela n'a pas résolu mon problème, il a été une longue journée de programmation :) – Roise

1

La définition SendMessage est

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall; 

Mise à jour

Pour Msg = WM_COPYDATA:

  • Le premier argument est une poignée à la fenêtre recevant les données
  • Le troisième argument est une poignée à la fenêtre passer les données

Si vous nommez le premier argument SSTR Je suppose que ce n'est pas une poignée mais une chaîne.

+0

Mauvais comment?mon premier pars sst est le handle de la fenêtre de réception, WM_CopyData est le message, Handle est le handle de la DLL et @copyDataStruct est la donnée à envoyer. Je ne vois pas la faute ici. – Roise

+0

@Rosie: Quel type de données est 'sStr'? –

+0

sStr est une chaîne. Lequel je tape manuellement dans le Handel pour le formulaire de ciblage. – Roise

0

Je pense que le problème est que vous essayez d'utiliser le nom ou quelque chose pour votre fenêtre, et qui ne fonctionne pas.

Essayez ceci:

var 
    Wnd: HWnd; 
begin 
    Wnd := GetForegroundWindow(); // Assumes your target window is up front 
    // Fill in CopyData structure here. 
    SendMessage(Wnd, WM_COPYDATA, SomeWParamValue, Cardinal(@CopyDataStruct)); 
end;