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

时间:2012-02-21 16:47:00

标签: c++ windows delphi winapi delphi-7

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

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

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

代码会很好(请{No JCL)。 C ++也没关系。 感谢。


编辑:我认为我的主要问题是如何在UnmapViewOfFile完成数据读取之后将主要应用“发出信号”CloseHandleupdate.exe。 (或者我的子进程中OpenFileMapping设置为bInheritHandle时,我需要使用True吗?)
这是一个Example。如果主进程调用UnmapViewOfFileCloseHandle,第二个进程如何读取数据?

2 个答案:

答案 0 :(得分:2)

您可以在Inter-process communication找到一些好的例子。正确的方法取决于您的数据大小和速度要求。

答案 1 :(得分:1)

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

如果您需要使用此类型的系统来控制从服务到应用程序或使用不同用户凭据运行的应用程序的消息传递,请确保使用“Global”启动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,只需一个视图,当然,如果需要,您可以在同一个文件上创建多个较小的视图。