如何正确使用文件映射并将数据传递给subprocess?

我的应用程序正在执行另一个进程(“ update.exe ”),我想从我的应用程序到更新程序传递大量数据(可能是一个logging)。

使用命令行传递数据参数不是一个选项,因为数据太大(数据大小可能会有所不同)。

如何正确地创buildCreateFileMapping / MapViewOfFile / UnmapViewOfFile
然后执行我的update.exe
最后接收update.exe程序( OpenFileMapping )中的数据,
并释放所有句柄(从主应用程序和update.exe ),所以我没有内存/句柄泄漏?

代码会很好(没有JCL请)。 C ++也很好。 谢谢。


编辑:我认为我的主要问题是如何将主要的应用程序“信号”到update.exe完成读取数据后的UnmapViewOfFileCloseHandle 。 (或者我需要使用OpenFileMappingbInheritHandle设置为True在我的subprocess?)
这是一个例子 。 如果主进程调用UnmapViewOfFileCloseHandle ,第二个进程如何读取数据?

您可以在进程间通信中找到一些很好的例子。 正确的方法取决于您的数据大小和速度要求。

下面是我们用于在应用程序之间传递实时视频(未压缩)的内存映射文件的代码片段,SecurityDescriptor不是必需的,但是我已经将其留在了,CreateWorldAccessDescriptor是我们的一个功能。

如果您需要使用这种类型的系统来控制从服务到应用程序的消息传递,或者使用不同用户凭据运行的应用程序,请确保使用“全局”启动FileName

 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; 

希望有点帮助。

更新

这段代码只是在整个文件的文件上创建一个MapView,并且只是一个视图,如果需要的话,当然可以在同一个文件上创建多个小视图。