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
 
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.075 Beiträge
 
Delphi 12 Athens
 
#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
AppCentral
  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 07:20 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