質問
Win32 APIを使用してファイルから共有メモリに書き込むにはどうすればよいですか
次のコードがあります:
hFile = CreateFile("input.map",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
hMapFile = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
0,
TEXT("SharedObject"));
lpMapAddress = (LPTSTR) MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
ReadFile(
hFile,
lpMapAddress,
75,
&bytesRead,
NULL);
sprintf((char*)lpMapAddress, "<output 1>");
printf((char*) lpMapAddress);
ただし、printf呼び出しは<!> quot; <!> lt;のみを返します。出力1 <!> gt; <!> quot;ファイルの内容ではありません。
編集: 問題が見つかりました。 sprintfを呼び出すときに、入力ファイルに書き込みます。しかし、まだ理由がわかりません...
解決
これはコードサンプル全体ですか? sprintf
を呼び出すと、lpMapAddress
にNULLで終わる文字列が置かれ、少なくともprintf
ステートメントの目的のために、ファイルから読み取ったものが事実上上書きされます。
読み込んだ内容の最初の部分を文字列"<output 1>"
に置き換える場合は、ファイルを読み込んだ後にこれを実行できます。
char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));
文字列のテキストをコピーしますが、nullターミネータはコピーしません。
他のヒント
sprintf
は<output 1>
の後にNULを保存し、printf
は最初のNULで停止します。
(また、フォーマットとしてランダムなファイルを%
に渡すのは悪い考えです。MapViewOfFile
文字が含まれていたらどうしますか?それは別の問題です。)
私が入力ファイルに書き込むのは sprintfを呼び出します。しかし、私はまだ知りません なぜ...
それが<=> することであるからです。ファイルの内容をメモリブロックに関連付けます。ファイルの現在の内容がメモリブロックに表示され、そのメモリに加えた変更がファイルに書き込まれます。
マッピング後にReadFileを呼び出す必要はないと思います。 lpMapAddressからコンテンツにアクセスするだけです。
ただし、MapViewOfFileに定数を使用しても、メモリファイルマッピングを使用してもメリットはありません。
あなたがここで何を得ているのか本当に分かりません。どのコードを前に置いてもかまいません。その最後の行は、前の<!> quot; sprintf <!> quot;でバッファに配置した文字列を always 返します。ライン。それは<!> quot; <output 1>
<!> quot;なので、はい、返されます。