Ah le cast ne fonctionne pas, je suis sous C++Builder depuis un an et demi, je rouille litéralement en Delphi
est-ce mieux avec
PostMessage(Handle, WM_TRUC, Integer(MonSingle), 0);
ou alors
PostMessage(Handle, WM_TRUC, PInteger(@MonSingle)^, 0);
MonSingle doit être Single, pas Double ni Real
Envoyé par
Sephiroth Lune
J'ai testé le code de Shai, ça fonctionne "à peu près". Des fois j'ai des access violation aléatoirement ...
Si tu as copié le code là
sache qu'il y a une horreur absolue et que cela ne gère pas du tout l'Unicode !
Ce truc là, peux planter si le Text ne fait pas au moins 60 caractères, et pour l'unicode, cela fait n'importe quoi !
CopyMemory(@Truc.C, @MemoSend.Lines.Text[1], 60);
J'ai encore l'exe compilé en D7 avec ce code (sauf la partie mémo qui est différente)
Je lance deux instances du programme et j'échange très bien sans VA
Pour le moment, tu testes comment ?
Le même programme lancé deux fois (c'est ce que je fais)
Si deux programmes différent, fait attention à l'alignement mémoire dans les options de projet
tente ceci rester ANSI même en 2009..XE2
1 2 3 4 5 6
| type
TTrucData = packed record // oh alignement sur 1 pour pas de soucis
I: Integer;
D: Double;
C: array[1..60] of AnsiChar;
end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| procedure TFrmTestMemory.BtnSendDataClick(Sender: TObject);
var
Truc: TTrucData;
Data: PCOPYDATASTRUCT;
begin
lblHandleMe.Caption := IntToStr(Self.Handle);
if StrToIntDef(EdHandleOther.Text, 0) <= 0 then
begin
Exit;
end;
Truc.I := MemoSend.Lines.Count;
Truc.D := Now();
StringToArrayOfChar('Salut', @Truc.C[1], Length(Truc.C));
New(Data);
Data.dwData := 0;
Data.cbData := SizeOf(Truc);
Data.lpData := @Truc;
SendMessage(StrToInt(EdHandleOther.Text), WM_COPYDATA, Self.Handle, LongInt(Data));
Dispose(Data);
end;
procedure TFrmTestMemory.ReceiveData(var message: TMessage);
var
Truc: TTrucData;
Data: PCOPYDATASTRUCT;
Reveive: PChar;
begin
if message.LParam > 0 then
begin
CopyMemory(@Truc, PCOPYDATASTRUCT(message.LParam).lpData, PCOPYDATASTRUCT(message.LParam).cbData);
MemoReceive.Lines.Text := Truc.C;
MemoReceive.Lines.Add(IntToStr(Truc.I));
MemoReceive.Lines.Add(FormatDateTime('dddd dd mm yyyy hh:nn:ss zzz', Truc.D));
end;
end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| procedure StringToArrayOfChar(const S: AnsiString; const AoC: PAnsiChar; const LengthAoC: Integer);
var
LengthS: Integer;
begin
if LengthAoC <= 0 then
Exit;
LengthS := Length(S);
if LengthS < LengthAoC then
begin
ZeroMemory(Pointer(Integer(AoC) + LengthS), LengthAoC - LengthS);
CopyMemory(AoC, @S[1], LengthS);
end else
begin
StrLCopy(AoC, @S[1], LengthAoC);
end;
end; |
Partager