Voglio inviare un record, che al momento ha solo una stringa, ma aggiungerò altre variabili. È la prima volta che lavoro con i dischi, quindi questa è forse una domanda stupida. Ma, perché questo funziona:SendMessage (WM_COPYDATA) + Record + String
type
TDataPipe = record
WindowTitle: String[255];
end;
var
Data: TDataPipe;
copyDataStruct : TCopyDataStruct;
begin
Data.WindowTitle:= String(PChar(HookedMessage.lParam));
copyDataStruct.dwData := 0;
copyDataStruct.cbData := SizeOf(Data);
copyDataStruct.lpData := @Data;
SendMessage(FindWindow('TForm1', nil), WM_COPYDATA, Integer(hInstance), Integer(@copyDataStruct));
end;
lato ricevente:
type
TDataPipe = record
WindowTitle: String[255];
end;
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
sampleRecord : TDataPipe;
begin
sampleRecord.WindowTitle:= TDataPipe(Msg.CopyDataStruct.lpData^).WindowTitle;
Memo1.Lines.Add(sampleRecord.WindowTitle);
end;
Perché se sul disco, io uso:
WindowTitle: String; //removed the fixed size
e sul lato di invio che uso:
Data.WindowTitle:= PChar(HookedMessage.lParam); //removed String()
semplicemente non va?
ottengo le violazioni di accesso/app freeze ...
Lo scenario è: l'invio di lato è una DLL utilizzando agganciato SetWindowsHookEx, ricevendo lato un semplice exe che ha caricato/chiamato SetWindowsHookEx ...
Ottima risposta! Grazie ancora, sempre con risposte complete e informative. – LessStress