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