共有メモリ関数の作成CreateFileMapping()の詳細
2796 ワード
ファイルマッピングを作成して開くと、「ハンドルが無効」というエラーがよく発生します.MSDNをよく見てから、関数が認識できないことに気づきました.ここでは、関連する解釈を翻訳します.
1)物理ファイルハンドル取得可能な任意の物理ファイルハンドルは、物理ファイルに関係のないメモリマッピングを作成する必要がある場合は、0 xFFFFFFFF(INVALID_HANDLE_VALUE)に設定すればよい.
物理ファイルに関連付ける必要がある場合は、物理ファイルが作成されたときのアクセスモードが「保護設定」と一致していることを確認します.たとえば、物理ファイルが読み取り専用で、メモリマッピングが読み書きを必要とするとエラーが発生します.物理ファイルを独占的に作成することをお勧めします.
INVALIDを使うとHANDLE_VALUEは、物理ファイルのハンドルパラメータが有効かどうかにかかわらず、申請するメモリ領域のサイズを設定する必要があります.これにより、CreateFileMapingは物理ファイルのサイズに関係なく、実際のファイルのサイズを超えるメモリ領域を作成することができます.物理ファイルが有効で、サイズパラメータが0の場合、物理ファイルのサイズと同じメモリ領域のアドレス範囲を返します.あなたに返されるファイルマッピングアドレス空間は、コピー、統合、または名前付けによって得ることができ、初期内容は0である.
2)保護設定はセキュリティ設定であるが、一般的にNULLを設定すればよい、デフォルトのセキュリティ構成を用いる.win 2 kで制限が必要な場合は、メモリファイルのマッピングをネットワーク全体に共有するアプリケーションプロセスに対して使用するものであり、制限を考慮することができる.
3)上位ファイルサイズ兄弟たち,現在我々のマシンは32ビットの東であり,32ビットプロセスを超えるアドレスを得ることができないプライベート32ビットアドレス空間を得ることは不可能であると思いますが,一般的には0を設定しましょう.0を超えるような設定はしたくない場合.4)下位ファイルサイズを設定することはできますが,他の共有ユーザに申請したファイルマッピングに関する情報を知らせるためには,私が使用する場合、取得したアドレス空間ヘッダに構造化記述情報、記録メモリマッピングの大きさ、名称などを追加することで、実際に申請する空間が入力よりもヘッダ情報構造の大きさが大きくなるので、BSTRのような方式が合理的であると思います.
5)共有メモリ名これは私が今日テストしたときに壁にぶつかった禍根です.メモリに対して反発アクセスを行うために、私は反発ハンドルを設置しました.名前は共有メモリの同名を選択して命名しました.以下は彼らが共通のnamespaceを使ってエラーを起こしたからです.ほほほ.
6)CreateFileMapping呼び出し時GetLastErrorの対応エラーERROR_FILE_INVALIDゼロ長のファイルマッピングを作成しようとする場合は、このレポートERROR_INVALID_HANDLE名前付きメモリ領域と既存のメモリマッピング、反発量、信号量、臨界領域の同名を発見したらERROR_ALREADY_EXISTSはメモリスペースネーミングが既に存在することを示す
7)関連サービスまたはプラットフォームの命名保留Terminal Services:命名は「Global」または「Local」接頭辞を含むことができ、グローバルまたはセッション名空間における初級ファイルマッピングを含むことができる.他の部分には()以外の文字を含めることができます.Kernel Object Name Space sを参照してください.
Windows 2000 or later:Terminal ServicesがGlobalとLocalのプレフィックスを実行していない場合は無視されます
1 HANDLE CreateFileMapping(
2 HANDLE hFile, //
3 LPSECURITY_ATTRIBUTES lpAttributes, //
4 DWORD flProtect, //
5 DWORD dwMaximumSizeHigh, //
6 DWORD dwMaximumSizeLow, //
7 LPCTSTR lpName //
8 );
1)物理ファイルハンドル取得可能な任意の物理ファイルハンドルは、物理ファイルに関係のないメモリマッピングを作成する必要がある場合は、0 xFFFFFFFF(INVALID_HANDLE_VALUE)に設定すればよい.
物理ファイルに関連付ける必要がある場合は、物理ファイルが作成されたときのアクセスモードが「保護設定」と一致していることを確認します.たとえば、物理ファイルが読み取り専用で、メモリマッピングが読み書きを必要とするとエラーが発生します.物理ファイルを独占的に作成することをお勧めします.
INVALIDを使うとHANDLE_VALUEは、物理ファイルのハンドルパラメータが有効かどうかにかかわらず、申請するメモリ領域のサイズを設定する必要があります.これにより、CreateFileMapingは物理ファイルのサイズに関係なく、実際のファイルのサイズを超えるメモリ領域を作成することができます.物理ファイルが有効で、サイズパラメータが0の場合、物理ファイルのサイズと同じメモリ領域のアドレス範囲を返します.あなたに返されるファイルマッピングアドレス空間は、コピー、統合、または名前付けによって得ることができ、初期内容は0である.
2)保護設定はセキュリティ設定であるが、一般的にNULLを設定すればよい、デフォルトのセキュリティ構成を用いる.win 2 kで制限が必要な場合は、メモリファイルのマッピングをネットワーク全体に共有するアプリケーションプロセスに対して使用するものであり、制限を考慮することができる.
3)上位ファイルサイズ兄弟たち,現在我々のマシンは32ビットの東であり,32ビットプロセスを超えるアドレスを得ることができないプライベート32ビットアドレス空間を得ることは不可能であると思いますが,一般的には0を設定しましょう.0を超えるような設定はしたくない場合.4)下位ファイルサイズを設定することはできますが,他の共有ユーザに申請したファイルマッピングに関する情報を知らせるためには,私が使用する場合、取得したアドレス空間ヘッダに構造化記述情報、記録メモリマッピングの大きさ、名称などを追加することで、実際に申請する空間が入力よりもヘッダ情報構造の大きさが大きくなるので、BSTRのような方式が合理的であると思います.
5)共有メモリ名これは私が今日テストしたときに壁にぶつかった禍根です.メモリに対して反発アクセスを行うために、私は反発ハンドルを設置しました.名前は共有メモリの同名を選択して命名しました.以下は彼らが共通のnamespaceを使ってエラーを起こしたからです.ほほほ.
6)CreateFileMapping呼び出し時GetLastErrorの対応エラーERROR_FILE_INVALIDゼロ長のファイルマッピングを作成しようとする場合は、このレポートERROR_INVALID_HANDLE名前付きメモリ領域と既存のメモリマッピング、反発量、信号量、臨界領域の同名を発見したらERROR_ALREADY_EXISTSはメモリスペースネーミングが既に存在することを示す
7)関連サービスまたはプラットフォームの命名保留Terminal Services:命名は「Global」または「Local」接頭辞を含むことができ、グローバルまたはセッション名空間における初級ファイルマッピングを含むことができる.他の部分には()以外の文字を含めることができます.Kernel Object Name Space sを参照してください.
Windows 2000 or later:Terminal ServicesがGlobalとLocalのプレフィックスを実行していない場合は無視されます