我有一个Windows服务(在系统进程中运行)和一个需要共享配置结构的桌面应用程序。数据源自应用程序,但用户进程没有创建全局内存对象的权限,因此我在服务启动时使用CreateFileMapping()和基于thisanswer的DACL创建了它。.这似乎工作正常:我从CreateFileMapping()得到一个非空句柄并且GetLastError()是0。问题是应用程序看不到对象——OpenFileMapping()返回一个NULL句柄和ERROR_FILE_NOT_FOUND——如果我用WinObj手动浏览全局对象,我也看不到它。是什么让我的对象不可见?SECURITY_ATTRI
我目前尝试使用WindowsCreateFileMapping实现一些进程间通信机制。我知道我需要先用CreateFileMapping创建一个文件映射对象,然后用MapViewOfFile创建一个指向实际数据的指针。然后,该示例使用CopyMemory将数据放入映射文件。在我的应用程序中,我有一个图像缓冲区(1MB大),我想将其发送到另一个进程。所以现在我查询一个指向图像的指针,然后将整个图像缓冲区复制到映射文件中。但我想知道这是否真的有必要。难道不能只在共享内存中复制指向图像缓冲区数据的实际指针吗?我尝试了一下,但没有成功。 最佳答案
我正在尝试在Windows下使用内存映射文件(使用CreateFile/CreateFileMapping/MapViewOfFile函数),并且我当前在调用CREATE_FILE时指定FILE_SHARE_READ和FILE_SHARE_WRITE。但是,这会锁定文件以防止其他进程使用。我想要的是在调用CreateFileMapping或MapViewOfFile时内存映射文件的快照,这样我就看不到对文件所做的任何更改(写入或删除)通过其他过程。有点像写时复制,但其他进程正在执行写入。我可以在Windows上使用内存映射文件来执行此操作吗? 最佳答案
我对内存映射文件非常陌生,而且我对某些事情有点迷茫。我知道,如果我有一个文件,我可以使用MMaps一次加载它并从多个进程访问它。但在我的情况下,我正在创建一个附加到进程A的DLL,并且已为该DLL提供指向进程A准备的cSurface的指针。我需要与进程B共享那个cSurface的数据。我真的不想调用一个空白的MMap并将我的进程A的表面复制到其中,只是为了在进程B中再次复制它。是否可以像文件一样映射我的表面,以便MMap在创建时已经指向表面数据(就像我加载SomeTextFile.txt一样)?理论上,我的计划是在ProcA中接收一个指向表面的指针,告诉Windows以给定的名称共享该
我在理解如何使用API函数CreateFileMapping(...)时遇到问题。我一直在尝试映射一个小文件,然后反转它的内容。它只有大约1Kb,但我一直收到“内存不足”错误。我已通过调用CreateFile打开了文件,并使用GetFileSize获取了它的大小。然后我调用:CreateFileMapping(fileHandle,NULL,PAGE_READWRITE|SEC_RESERVE,fileSize+1,fileSize+1,NULL);我怀疑问题是将fileSize+1作为dwFileOffsetHigh和dwFileOffsetLow传递,但我很难理解应该做什么我改为传
只是想知道我是否正在像这样在Windows平台上创建共享内存阵列:HANDLEhFile=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE|SEC_COMMIT,0,1024*4,_T("mySharedMemName"));if(hFile){VOID*pData=MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,1024*4);//Is'pData'arrayinitializedwithzerosthefirsttimethe'hFile'isused?}我第一次调用这段代码
我需要按顺序读取(扫描)文件并处理其内容。文件大小可以从非常小(一些KB)到非常大(一些GB)。我在Windows764位上使用VC10/VS2010尝试了两种技术:Win32内存映射文件(即CreateFile、CreateFileMapping、MapViewOfFile等)fopen并从CRT读取。我认为内存映射文件技术可能比CRT函数更快,但一些测试表明两种情况下的速度几乎相同。以下C++语句用于MMF:HANDLEhFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLA
我需要按顺序读取(扫描)文件并处理其内容。文件大小可以从非常小(一些KB)到非常大(一些GB)。我在Windows764位上使用VC10/VS2010尝试了两种技术:Win32内存映射文件(即CreateFile、CreateFileMapping、MapViewOfFile等)fopen并从CRT读取。我认为内存映射文件技术可能比CRT函数更快,但一些测试表明两种情况下的速度几乎相同。以下C++语句用于MMF:HANDLEhFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLA
一、简述共享内存共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信。因为是通过内存操作实现通信,因此是一种最高效的数据交换方法。本文主要讲述的使用内存映射文件的目的是访问磁盘上的数据文件。你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。二、函数API1、CreateFileMapping//创建一个内存映射文件的内核对象HANDLECreateFileMapping( HANDLEhFile, //文件句柄,填写INVALID_HANDLE_VALUE LPS
我有两个关于使用共享内存的问题。我正在使用CreateFileMapping在两个进程之间创建共享内存区域。1)我知道我需要对从CreateFileMapping或OpenFileMapping调用返回的每个句柄调用CloseHandle以释放内存。我的问题是,如果使用共享内存的程序在没有调用CloseHandle的情况下退出,WindowsXP/7是否会正确关闭所有句柄并释放内存?IE-在关闭所有使用内存的进程后是否存在内存泄漏的可能性?2)我使用MapViewofFile获取指向内存的指针。在1个实例中,我假设共享内存将始终存在于方法的上下文中。所以我将MapViewOfFile的