【问题标题】:the program crashes as soon i execute [closed]我一执行程序就崩溃了[关闭]
【发布时间】:2016-04-07 18:40:28
【问题描述】:

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

【问题讨论】:

  • 使用调试器进行代码单步调试?依赖.exe?错误信息?
  • 您不必为内存映射文件映射 > 0 字节的文件吗?虽然我上一次使用 WINAPI 查看内存映射文件是在 1990 年代后期。
  • 它会立即崩溃您的调试器应该会提供帮助。
  • learn how to use a debugger 的好机会。
  • 您没有检查错误并获得了通常的后果。

标签: c++ api winapi memory shared


【解决方案1】:

它崩溃的原因是因为必须使用GENERIC_READGENERIC_WRITE 访问权限创建文件,因为在CreateFileMapping() 函数中,您的代码将PAGE_READWRITE 指定为其第三个参数(flProtect)。这是来自CreateFileMapping 的 MSDN 文档:

该文件必须以兼容的访问权限打开 flProtect 参数指定的保护标志

PAGE_READWRITE=>授予对特定页面区域的读/写访问权限。 hFile 指定的文件必须使用 GENERIC_READ 创建 和 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 的代码。应用程序应该测试带有 长度为 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

【讨论】:

  • 我已经尝试过这个说法,但结果还是一样!!
  • 我认为 sprintf 语句有问题,当我厌倦了它而没有该语句时,程序正常工作
  • 所以我需要一个备用来写入共享内存
  • @shashank karukonda 问题不在于 sprintf 函数,而是您正在尝试为大小为 0 的文件创建映射。我已经更新了答案以反映这一点。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多