AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WM_COPYDATA mit arrays?

Ein Thema von nru · begonnen am 20. Mai 2010 · letzter Beitrag vom 21. Mai 2010
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz