0

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呼び出しは「<output 1>」のみを返し、ファイルの内容は返しません。

編集:問題を見つけました。sprintfを呼び出すときに、入力ファイルに書き込んでいます。しかし、私はまだ理由がわかりません...

4

4 に答える 4

2

これはコード サンプル全体ですか? sprintfへの呼び出しがヌルで終わる文字列をに配置するように見えます。lpMapAddressこれにより、少なくともprintfステートメントの目的のために、ファイルから読み取ったものはすべて効果的に上書きされます。

読み取った内容の最初の部分を string に置き換えたい場合は"<output 1>"、ファイルを読み取った後にこれを行うことができます。

char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));

これにより、文字列のテキストがコピーされますが、ヌル ターミネータはコピーされません。

于 2009-09-14T19:17:02.713 に答える
2

は の後にsprintfNUL を格納し、最初の NUL で停止します。<output 1>printf

(また、ランダムなファイルを形式として に渡すのは悪い考えですprintf。文字が含まれている場合はどう%でしょうか? しかし、それは別の問題です。)

sprintf を呼び出すと、入力ファイルに書き込みます。しかし、私はまだ理由を知りません...

MapViewOfFile それが何をするからです。ファイルの内容をメモリのブロックに関連付けます。ファイルの現在の内容がメモリ ブロックに表示され、そのメモリに加えた変更がファイルに書き込まれます。

于 2009-09-14T19:17:04.630 に答える
1

マッピング後に ReadFile を呼び出す必要はないと思います。lpMapAddress からコンテンツにアクセスするだけです。

ただし、MapViewOfFile に定数を使用しても、メモリ ファイル マッピングを使用しても何のメリットもありません。

于 2009-09-14T19:26:12.133 に答える
0

あなたがここで何を得ているのか、私にはよくわかりません。前にどんなコードを入れても構いません。その最後の行は、前の「sprintf」行でバッファに配置した文字列を常に返します。それは " <output 1>" なので、そうです、それが返されます。

于 2009-09-14T19:20:32.190 に答える