2016-04-07 11 views
-3

このプログラムはwin32 APIを使って共有メモリに書き込むはずです。テキストブックのように与えられたプログラムですが、実行しようとすると失敗します。私は実行私はすぐにプログラムがクラッシュする

をクリックすると、ファイルがで以来GENERIC_READGENERIC_WRITEアクセス権を使用して作成されなければならないので、それがクラッシュした理由がある

#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); 
} 
+3

デバッガでステッピングするコードはありますか? depends.exe?エラーメッセージ? – Ceros

+1

メモリマップされたファイルに> 0バイトのファイルをマップする必要はありませんか?私がWINAPIを使ってメモリマップファイルを見たのは1990年代後半でした。 – drescherjm

+0

エラーメッセージは表示されません。 @cerosすぐにクラッシュします –

答えて

3

共有メモリへのプログラムは、文字列を記述することになってクラッシュしますCreateFileMapping()関数のコードでは、第3引数(flProtect)としてPAGE_READWRITEが指定されています。これはCreateFileMappingのMSDNドキュメントからです:

ファイルがflProtectパラメータを指定する 保護フラグと互換性があるアクセス権で開かれなければならない

PAGE_READWRITE =>特定への読み取り/書き込みアクセスを提供しますページの領域。 hFileで指定されたファイルは、GENERIC_READ およびGENERIC_WRITEアクセス権で作成する必要があります。

ので、あなたがゼロのサイズのファイルをマップすることはできません

hFile=CreateFile("temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL); 

もう一つに

hFile=CreateFile("temp.txt",GENERIC_WRITE,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 
+0

私はすでにそのステートメントを試していますが、結果は同じです! –

+0

私はsprintfステートメントに問題があると思います。そのステートメントがなくてもプログラムが正常に機能したら、 –

+0

私は共有メモリに書き込むために別のものが必要です。 –

関連する問題