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.