Thema: Delphi WM_COPYDATA mit arrays?

Einzelnen Beitrag anzeigen

nru

Registriert seit: 30. Mai 2008
Ort: Bonn
40 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: WM_COPYDATA mit arrays?

  Alt 20. Mai 2010, 22:39
Zitat von Luckie:
Und warum nicht?
Synchronisation, Handling und Geschwindigkeit waren/sind meine Bedenken.

Doch man kommt ja leider oft sehr schnell auf den Boden der Tatsachen zurück - so auch ich in diesem Fall. Denn meine MMF-Versuche waren leider alles andere als glücklich bzw. erfolgreich. Vielen Dank nochmal an jaenicke für die vielen sehr brauchbaren Code-Schnipsel.

Aber ich habe feststellen müssen, dass mir hier dann doch noch ein paar basics fehlen. Ich habs leider nicht hinbekommen, das dyn. Array of TFindTitel als Pointer in das MMF zu schreiben und anschl. daraus wieder was brauchbares zu casten. Das ist, was ich mit basics meine

Hättet ihr hierzu vielleicht auch noch ein paar Ideen? Das wär echt klasse.


Hier mal meine bisherigen Ansätze (Fragmente).

Sender sucht Infos in DB und verpackt die in ein array, welches dann in die MMF geschrieben werden soll.
Die Rückgabe von FindFilmTitel wird an dvbWriteMMF übergeben (ist hier nicht aufgeführt).

Delphi-Quellcode:

type
   TFindTitel = packed record
      Name: String[255];
      ID: Integer;
   end;
   PFindTitel = ^TFindTitel;

   TFindTitelArray = array of TFindTitel;



function FindFilmTitel( cSearch: String ): TFindTitelArray;
var
   i: Integer;
   x: TFindTitelArray;
begin

// weggelassener DB-Stuff
   SetLength( x, RecCount );
   i := 0;
   while not eof do begin
      x[i].Name := FieldByName('TITEL').AsString;
      x[i].ID := FieldByName('FNUM').AsInteger;
      Inc(i);
      Next;
   end;
   result := x;

end;

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, PChar( MmfCommunicationName ));

   if FMMFFileHandle <> 0 then begin
      MMFPointer := MapViewOfFile(FMMFFileHandle, FILE_MAP_WRITE, 0, 0, memSize);
      CopyMemory(MMFPointer, @x, memSize);
      UnmapViewOfFile(MMFPointer);
   end;

   // Benachrichtigung an wartenden Emfpänger senden (incl. Anzahl Datensätze!)
   // Empfänger geht dann hin und soll MMF lesen
   SendMessage( hwnd, CatchMsg, High(x)+1, 0 );

end;

Empfänger bekommt die Msg und weiss, dass nun aus dem MMF gelesen werden könnte ... und versucht das erfolglos über die folgende Funktion.

Delphi-Quellcode:
function dvbReadMMF( nCount: Integer ): TFindTitelArray;
var
   HandleCount: Integer;
   MMFPointer: Pointer;
   MMFFileHandle: THandle;
   x: TFindTitelArray;
   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( x, nCount );
      memSize := nCount * SizeOf(TFindTitel);
      CopyMemory(@x, MMFPointer, memSize);

      UnmapViewOfFile(MMFPointer);

   end;

   result := x;

end;
Das resultierende TFindTitelArray bzw. die darin enthaltenen Records sollte dann vom Emfpänger weiterverarbeitet werden können. Geht aber nicht - Exception beim Zuweisen an Result.

Mit sowas
PFindTitelArray = ^TFindTitelArray;
und
CopyMemory(y, MMFPointer, memSize);
result := TFindTitelArray(y^);
hab ich dann auch ohne Erfolg experiementiert.


Ihr wisst sicher auch warum - ich leider noch nicht

Vielleicht doch lieber die "WM_COPYDATA-Je-Datensatz"-Variante?

Gruss
Norbert
  Mit Zitat antworten Zitat