ページ 11

CreateFileMapping

Posted: 2013年2月03日(日) 19:32
by Cユーザー
以下のコードはmsdnにあったものですが
CreateFileMappingに関して、引数にあるサイズを表す上位DWORDとは
何なのでしょうか?

コード:

HANDLE CreateFileMapping(
  HANDLE hFile,                       // ファイルのハンドル
  LPSECURITY_ATTRIBUTES lpAttributes, // セキュリティ
  DWORD flProtect,                    // 保護
  DWORD dwMaximumSizeHigh,            // サイズを表す上位 DWORD
  DWORD dwMaximumSizeLow,             // サイズを表す下位 DWORD
  LPCTSTR lpName                      // オブジェクト名
);

文字列配列をメンバーに持つ構造体をマッピングさせ、配列に値を数千入れていくとエラーが発生します。このサイズを表すって所の数値を上げたらエラーにならなくなったので、おそらくメモリを確保していない領域に値をいれようとしたからだと思います。

この部分はどういう計算でメモリを取得しているのでしょうか?

Re: CreateFileMapping

Posted: 2013年2月03日(日) 20:28
by YuO
Cユーザー さんが書きました:CreateFileMappingに関して、引数にあるサイズを表す上位DWORDとは
何なのでしょうか?
マッピング対象になるサイズ,64bitのうちの上位32bitです。
実際にマッピング対象になるサイズは,

コード:

dwMaximumSizeHight * 0x100000000ULL | dwMaximumSizeLow
となります。

コード:

(unsigned long long)dwMaximumSizeHight << 32 | dwMaximumSizeLow
と書いた方が分かり易いかもしれません。
Cユーザー さんが書きました:文字列配列をメンバーに持つ構造体をマッピングさせ、配列に値を数千入れていくとエラーが発生します。このサイズを表すって所の数値を上げたらエラーにならなくなったので、おそらくメモリを確保していない領域に値をいれようとしたからだと思います。
実際にメモリをコミットするのはMapViewOfFile APIの方です。
CreatFileMapping APIではありません。
エラーが何かによりますが,どれだけメモリを確保したかはちゃんと気にした方が良いですよ。

Re: CreateFileMapping

Posted: 2013年2月06日(水) 00:02
by Cユーザー
申し訳ありません。ちょっともう少し深く聞いてみたいので、別途スレたてます。

ありがとうございました。