Thema: Delphi WM_COPYDATA mit arrays?

Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.357 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: WM_COPYDATA mit arrays?

  Alt 21. Mai 2010, 08:15
Da hast du Recht, denn sonst wird nicht mit den Werten gearbeitet.

Hier mal aus dem Kopf kurz getippselt eine Variante, bei der die Größenangabe direkt am Anfang der MMF steht. So kann man auch andere Headerangaben mit übertragen. Das zusätzliche Array beim Empfang wird gar nicht gebraucht. Mit alzaimars Korrektur sollte es aber auch direkt schon klappen.
Delphi-Quellcode:
procedure dvbWriteMMFile(hwnd: THandle; const x: array of TFindTitel );
var
  FMMFFileHandle: THandle;
  MMFPointer: Pointer;
  memSize: Integer;
begin
  memSize := SizeOf(TFindTitel)*(High(x)+1);

  FMMFFileHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil,
    PAGE_READWRITE, 0, memSize + SizeOf(Integer), PChar( MmfCommunicationName ));

  if FMMFFileHandle <> 0 then
  begin
    MMFPointer := MapViewOfFile(FMMFFileHandle, FILE_MAP_WRITE, 0, 0, 0);
    PInteger(MMFPointer)^ := Length(x); // Anzahl der Datensätze an den Anfang schreiben
    Inc(PInteger(MMFPointer)); // Nach der Angabe der Anzahl weitermachen
    CopyMemory(MMFPointer, @x[0], memSize);
    UnmapViewOfFile(MMFPointer);
  end;

   // Benachrichtigung an wartenden Emfpänger senden
   // Empfänger geht dann hin und soll MMF lesen
   SendMessage( hwnd, CatchMsg, 0, 0 );
end;

function dvbReadMMF(): TFindTitelArray;
var
  MMFPointer: Pointer;
  MMFFileHandle: THandle;
  memSize: Integer;
begin
  MMFFileHandle := OpenFileMapping(FILE_MAP_READ, True, PChar( MmfCommunicationName) );

  if MMFFileHandle <> 0 then begin
    MMFPointer := MapViewOfFile(MMFFileHandle, FILE_MAP_READ, 0, 0, 0);

    SetLength(Result, PInteger(MMFPointer)^); // Anzahl der Datensätze auslesen
    memSize := PInteger(MMFPointer)^ * SizeOf(TFindTitel);
    Inc(PInteger(MMFPointer)); // Nach der Angabe der Anzahl weitermachen
    CopyMemory(@Result[0], MMFPointer, memSize);

    UnmapViewOfFile(MMFPointer);
  end;
end;
Ich denke mal so sollte es klappen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat