共有メモリへのプログラムは、文字列を記述することになってクラッシュします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
デバッガでステッピングするコードはありますか? depends.exe?エラーメッセージ? – Ceros
メモリマップされたファイルに> 0バイトのファイルをマップする必要はありませんか?私がWINAPIを使ってメモリマップファイルを見たのは1990年代後半でした。 – drescherjm
エラーメッセージは表示されません。 @cerosすぐにクラッシュします –