CreateFileMapping()-サイズのパラメーター
On 2月 10, 2021 by admin共有メモリに文を入れて、別のプログラムがこのマッサージを受けるプログラムを作成したいと思います。私はそれを作りましたが、CreateFileMapping()の4番目と5番目のパラメーターを理解していません。
私のプログラムでは256(5番目のパラメーター)を記述していますが、これを1に変更しても、プログラムは機能します。 dwMaximumSizeLowが最小サイズであると想定しているため、クラッシュするはずだと思いました。 4番目の引数に値を入れると、プログラムがクラッシュします。この値は5番目の値よりも高いはずだと思いましたが、間違っていました。
私のコード:
#include <iostream> #include <Windows.h> const char name[256] = "Map1"; const char massage[256] = "Welcome in the world without rules"; int main() { using std::cout; using std::cin; using std::endl; HANDLE hMap; hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 256, (LPCTSTR)name); if (!hMap) { cout << "create error" << endl; return 1; } char * data = (char*) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, NULL, NULL,NULL); if (!data) { cout << "mapview error" << endl; return 1; } if (!(CopyMemory(data, massage, sizeof(char) * 256)) ) { cout << "copy error" << endl; } cin.get(); UnmapViewOfFile(hMap); CloseHandle(hMap); return 0; }
4番目の値を説明してください。 CreateFileMapping()の5番目のパラメータは機能しますか?
コメント
- Microsoftを探すように依頼していますか'この関数のドキュメントはあなたのためですか? (これはGoogleにとって簡単です)またはドキュメントの特定の部分の意味の説明? ('理解できなかった正確な部分の引用を含めてもらえますか?推測できますが、'おそらく間違っていると思います)Iまた、'単一の関数がどのように機能するかについてのみ質問している場合は、このコードスニペットが質問にどのように関連しているかを理解していません。' / li>
- CreateFileMapping()の4番目と5番目のパラメーターについて質問しています。これは、'がどのように機能するかを理解していないためです。ドキュメントから、dwMaximumSizeHighは共有メモリ内のデータの最大サイズであり、dwMaximumSizeLowはデータの最小サイズであると思いました。それで、それがどのように機能するかを確認したかったので、1つのプログラムの5番目のパラメーターの値を変更しても機能しました。そして、'理由はわかりません。これは、最小サイズのプログラムがクラッシュするはずだからです。
回答
ドキュメントは、4番目と5番目のパラメータdwMaximumSizeHigh
を非常によく説明しています。およびdwMaximumSizeLow
。ただし、予想どおり、これらはデータの可能な最大サイズと最小サイズではありません。それらは同じものの上位部分と下位部分であり、それぞれが64ビットサイズの32ビット部分です。
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
したがって、256を入力するとこれらの値の両方で、共有メモリは256 * 4294967295 + 256 = 1 099 511 627776バイトになります。 「1099GBになります。その容量がありますか?
共有メモリのサイズが次の場合にクラッシュしないのはなぜですか。小さすぎますか?
サイズを1に減らし、共有メモリにさらにバイトを書き込むと、メモリが破損する可能性があります。見過ごされているかもしれません。
セグメンテーション違反がページングシステムを介して検出され、Windowsの一般的なページが4Kbであるため、クラッシュしません。メッセージの例は小さすぎて、要求されたアドレスが送信されたことをページングシステムが認識できません。範囲外です。
コメント
- この回答では上位と下位が何であるかが明確になっていますが、Microsoftのドキュメントは明確ではありません。
コメントを残す