Bonjour à tous, je vous expose mon probleme
Je veux qu'une application envoie des messages à une autre via une DLL

Je me suis donc fait une DLL dans laquelle j'utilise sendmessage

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
procedure fonctionQuiEnvoie(vStTYPE: Integer; vStDivers:ShortString);
var
  CDS           : COPYDATASTRUCT;
  envoi         : TEnvoiMsg;
  h             : THandle;
begin
  h := FindWindow(nil, PChar('MonAppliDestination'));
  if h <> 0 then
    begin
      envoi.TypeMsg  := vStTYPE;
      envoi.Date     := date+time;
      envoi.Divers   := vStDivers;
      CDS.dwData := 1;
      CDS.cbData := sizeof(Envoi);
      CDS.lpData := @Envoi;
      SendMessage(h , WM_COPYDATA , 0 , Integer (@CDS));
    end;
end;
et dans mon application qui va recevoir les messages, je me suis fait la fonction suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
  procedure Divers( var msg:TMessage);    message WM_COPYDATA;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
procedure TAutoUtil.Divers( var msg:TMessage);
var
  envoi2        : TEnvoiCls;
begin
    with PEnvoiMsg(PCopyDataStruct(msg.LParam)^.lpData)^ do
      begin
        envoi2          := TEnvoiCls.Create;
        envoi2.TypeMsg  := TypeMsg;
        envoi2.Date     := Date;
        envoi2.Divers   := Divers;
        fObMessages.AddObject('', envoi2);
      end;
end;
En fait je me suis deja géré ma propre queue avec un timer qui va voir toute les 1000 ms si un message est à traiter ( c'est à dire si fObMessages.Count > 0 ). Cela permet de rendre les moments de freeze beaucoup plus rare qu'avant. Car en effet, de temps en temps, l'application qui envoie des messages via ma DLL en envoie beaucoup quasi simultanément et du coup mon APPLI DESTINATION freeze totalement et reste bloquée, avec le CPU à 100%.


J'ai lu qu'il fallait utilisé les PostMessage au lieu de SendMessage, mais meme en faisant un tout petit test, à priori les messages n'arrivent jamais à bon port.

Quand je fais appel à GetLastError, j'obtiens cette erreur :
1159: Le message ne peut être utilisé qu'avec des opérations synchrones
Est-ce que quelqu'un aurait une idée pour solutionner le probleme ou en trouver la cause ?

Merci d'avance