我执行后,程序崩溃了

时间:2016-04-07 18:40:29

标签: c++ api winapi memory shared

该程序应该使用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);  
}  

1 个答案:

答案 0 :(得分:3)

崩溃的原因是因为必须使用GENERIC_READGENERIC_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