该程序应该使用win32
API写入共享内存。它是一个程序,因为它是在教科书中,但当我尝试执行它失败。当我点击执行
程序应该将字符串写入共享内存
#include<windows.h>
#include<stdio.h>
int main(int argc, char *argv[])
{
HANDLE hFile, hMapFile;
LPVOID lpMapAddress;
//mapping of memory
hFile=CreateFile("temp.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,0, TEXT("SharedObject"));
lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//writing into shared memory
sprintf((char*)lpMapAddress,"shared memory writing");
UnmapViewOfFile(lpMapAddress);
CloseHandle(hFile);
CloseHandle(hMapFile);
}
答案 0 :(得分:3)
崩溃的原因是因为必须使用GENERIC_READ
和GENERIC_WRITE
访问权限创建文件,因为在CreateFileMapping()
函数中,您的代码指定PAGE_READWRITE
作为其第三个参数(flProtect
)。这来自CreateFileMapping
的MSDN文档:
必须使用兼容的访问权限打开文件 flProtect参数指定的保护标志
PAGE_READWRITE =&gt;提供对特定页面区域的读/写访问权限。 必须使用GENERIC_READ创建hFile指定的文件 和GENERIC_WRITE访问权限。
所以改变
hFile=CreateFile("temp.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
到
hFile=CreateFile("temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
还有一件事你无法映射大小为零的文件。这是来自CreateFileMapping()
函数的MSDN文档:
如果此参数(dwMaximumSizeLow)和dwMaximumSizeHigh为0(零),则最大大小 文件映射对象的大小等于文件的当前大小 hFile识别出来。
尝试映射长度为0(零)的文件失败并显示错误 ERROR_FILE_INVALID的代码。应用程序应使用a测试文件 长度为0(零)并拒绝这些文件。
如果应用程序指定了文件映射对象的大小 大于磁盘上实际命名文件的大小,文件在 磁盘增加以匹配文件映射的指定大小 对象
所以在您的情况下,因为您尝试映射的文件最初的大小为0,CreateFileMapping()
函数将失败,除非您在dwMaximumSizeLow/dwMaximumSizeHigh
参数中指定文件映射对象的大小CreateFileMapping()
。你可以这样做......
HANDLE hFile, hMapFile;
LPVOID lpMapAddress;
//mapping of memory
hFile=CreateFile(L"temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
char* str="shared data to be written";//the data you want to write to the file
int strLen=::strlen(str);//get the string length of the data you want to write
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,strLen, TEXT("SharedObject")); //here you also specify the size of the mapping object to be equal to the size of data you want to write
if (hMapFile != NULL && hMapFile != INVALID_HANDLE_VALUE)
{
lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//writing into shared memory
if(lpMapAddress!=NULL)
sprintf((char*)lpMapAddress,"%s","shared file write");
else
printf("error");//error message MapViewOfFile() failed
UnmapViewOfFile(lpMapAddress);
CloseHandle(hMapFile);
}
else
printf("error");//error message CreateFileMapping() failed
CloseHandle(hFile);
}
else
printf("error");//error message CreateFile() failed