c ++ - Sådan bruger du korrekt mappekort og sender data til en børneproces?

Indlæg af Hanne Mølgaard Plasc

Problem



Min ansøgning udfører en anden proces (' update.exe '), og jeg vil gerne overføre store data (et optag måske) fra min app til programmet opdatering .


Brug af kommandolinje til at videregive dataparameteren (erne) er ikke en mulighed, fordi dataene er for store (også datastørrelsen kan variere).


Sådan korrekt opret CreateFileMapping/MapViewOfFile/UnmapViewOfFile,

Udfør derefter min update.exe ,

Endelig Modtagelse af dataene i programmet update.exe (OpenFileMapping),

og frigør alle håndtag (fra hovedapplikationen og update.exe ), så jeg ikke har hukommelse/håndtag lækager?


Kode ville være rart (Nej JCL takk). C + + er også fint.
Tak.





Rediger: Jeg tror, ​​at mit hovedproblem er at 'signalere' hovedapplikationen til UnmapViewOfFile og CloseHandle efter update.exe færdig med at læse dataene. (eller måske skal jeg bruge OpenFileMapping med bInheritHandle indstillet til True i min børneproces?)

Her er et eksempel. Hvordan kan den anden proces læse dataene, hvis hovedprocessen kalder UnmapViewOfFile og CloseHandle?. [15]

Bedste reference


Du kan finde et godt eksempel på Inter-process kommunikation. Den rigtige metode afhænger af størrelsen af ​​dine data og hastighedskrav.

Andre referencer 1


Heres en kodestykke fra en hukommelseskartet fil, vi bruger til at sende live video (ukomprimeret) mellem vores applikationer, SecurityDescriptor er ikke nødvendig, men jeg har forladt den, og CreateWorldAccessDescriptor er en af ​​vores funktioner.


Hvis du skal bruge denne type system til at styre meddelelser fra tjenester til applikation, eller fra programmer, der kører med forskellige brugeroplysninger, skal du sørge for at starte din FileName med 'Global \'


procedure TRawFeedImageQueue.CreateFileMap;
var
  SysInfo: TSystemInfo;
  sd: TSecurityDescriptor;
begin
  GetSystemInfo( SysInfo );
  MapGranularity := SysInfo.dwAllocationGranularity;
  MapSize := sizeof( TRawFeedImageQueueData );

  FSecObjOk := CreateWorldAccessDescriptor( sd, GENERIC\_ALL );

  FileMappingHandle := CreateFileMapping( $FFFFFFFF, @sd, PAGE\_READWRITE OR SEC\_COMMIT, 0, MapSize and $FFFFFFFF, PChar(FFileName) );
  if FileMappingHandle <> 0 then
  begin
    MapView := MapViewOfFile( FileMappingHandle, FILE\_MAP\_ALL\_ACCESS, 0, 0, MapSize );
  end
  else
  begin
    MapView := nil;
  end;
end;

procedure TRawFeedImageQueue.ReleaseFileMap;
begin
  if FileMappingHandle <> 0 then
  begin
    unMapViewOfFile( MapView );
    CloseHandle( FileMappingHandle );
  end;
end;


Håber det hjælper lidt.


Opdater


Denne kode skaber simpelthen en MapView på filen af ​​hele filen, og kun en enkelt visning, kan du selvfølgelig oprette flere mindre visninger på den samme fil, hvis det kræves.