我的应用程序正在执行另一个进程(“ update.exe ”),我想将大数据(可能是一条记录)从我的应用程序传递到 update 程序。
使用命令行传递数据参数不是一个选项,因为数据太大(数据大小也可能不同)。
如何正确创建CreateFileMapping
/ MapViewOfFile
/ UnmapViewOfFile
,
然后执行我的 update.exe ,
最后接收 update.exe 程序(OpenFileMapping
)中的数据,
并释放所有句柄(从主应用程序和 update.exe ),所以我没有内存/句柄泄漏?
代码会很好(请{No JCL
)。 C ++也没关系。
感谢。
编辑:我认为我的主要问题是如何在UnmapViewOfFile
完成数据读取之后将主要应用“发出信号”CloseHandle
和update.exe
。 (或者我的子进程中OpenFileMapping
设置为bInheritHandle
时,我需要使用True
吗?)
这是一个Example。如果主进程调用UnmapViewOfFile
和CloseHandle
,第二个进程如何读取数据?
答案 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,只需一个视图,当然,如果需要,您可以在同一个文件上创建多个较小的视图。