2017-01-28 12 views
1

私はテンプレートとしてマイクロソフトから次のコードを使用しています:テキストファイルでファイルマッピングを作成できないのはなぜですか?

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <tchar.h> 

#define BUF_SIZE 256 
TCHAR szName[]=TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[]=TEXT("Message from first process."); 

int _tmain() 
{ 
    HANDLE hMapFile; 
    LPCTSTR pBuf; 

    hMapFile = CreateFileMapping(
       INVALID_HANDLE_VALUE, // use paging file 
       NULL,     // default security 
       PAGE_READWRITE,   // read/write access 
       0,      // maximum object size (high-order DWORD) 
       BUF_SIZE,    // maximum object size (low-order DWORD) 
       szName);     // name of mapping object 

    if (hMapFile == NULL) 
    { 
     _tprintf(TEXT("Could not create file mapping object (%d).\n"), 
      GetLastError()); 
     return 1; 
    } 
    pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object 
         FILE_MAP_ALL_ACCESS, // read/write permission 
         0, 
         0, 
         BUF_SIZE); 

    if (pBuf == NULL) 
    { 
     _tprintf(TEXT("Could not map view of file (%d).\n"), 
      GetLastError()); 

     CloseHandle(hMapFile); 

     return 1; 
    } 


    CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 
    _getch(); 

    UnmapViewOfFile(pBuf); 

    CloseHandle(hMapFile); 

    return 0; 
} 

そして、それはうまく動作しますが、私の代わりに、ページングファイルのfile.txtと呼ばれるファイルを使用したいので、私はこれらの変更は十分なはずだと思います:

ficheroACompartir=CreateFile("file.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 

    if (ficheroACompartir==INVALID_HANDLE_VALUE) 
    { 
     printf("Could not open file\n"); 
     getchar(); 
    } 
    else 
    { 
     printf("File opened correctly\n"); 
     ReadFile(ficheroACompartir,buff,4096,&dwBytesRead,NULL); 
     printf("%s\n",&buff); //double check that the file is opened correctly in case I'm forgetting something, content displays fine 

     //CloseHandle(ficheroACompartir); 
    } 

    hMapFile = CreateFileMapping(
       ficheroACompartir, // use my file 
       NULL,     // default security 
       PAGE_READWRITE,   // read/write access 
       0,      // maximum object size (high-order DWORD) 
       BUF_SIZE,    // maximum object size (low-order DWORD) 
       szName);     // name of mapping object 

これらの変更はうまくいかず、「ファイルマッピングオブジェクトを作成できませんでした」というエラーが表示されます。

私には何が欠けていますか?

答えて

2

CreateFileを呼び出してテキストファイルを開くと、そのファイルへの読み取りアクセス(GENERIC_READ)のみが表示されるので、返されたファイルハンドルはファイルへの読み取り専用アクセスしか持たないようにします。次に、ファイルへのファイルマッピングを作成するときに、読み取り/書き込みアクセスが必要であると述べています。ファイルハンドルには読み取り専用アクセスしかないため、これは不可能であり、ファイルマッピングは失敗します。

CreateFileの2番目のパラメータをGENERIC_READ | GENERIC_WRITEに変更してください。

+0

あなたは正しいです、私はそれを忘れました。ありがとう! – user2638180

+0

また、これは[CreateFileMapping() '](https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537.aspx)ドキュメントに明記されています。" * PAGE_READWRITE 0x04:ビューを許可する** hFileパラメータで指定されたファイルハンドルは、GENERIC_READとGENERIC_WRITEのアクセス権で作成する必要があります**。* "CreateFileMapping()が呼び出されると、 '失敗しました、' GetLastError() 'はあなたにアクセス権の不一致があることを伝えていたはずです。常にエラーコードをチェックしてください。 –

関連する問題