DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FileMappingの解放

  • 題名: FileMappingの解放
  • 著者: telnet
  • 日時: 2012/06/28 21:17:24
  • ID: 30656
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[環境(Windows 7 )、使用言語(C# )、.NET Framework3.5]
分類:[.NET]

メモリを使用してデータのやりとりを行う際、
サイズが変わるタイミングで解放後、再度領域確保という流れで
プログラムを作成したいのですが解放を検知できません。
現在以下のようなプログラムを組んでいます。

@キー"ABC"という名でCreateFileMapping、MapViewOfFileで確保
ACloseHandle、UnmapViewOfFileで解放
BOpenFileMappingでアクセス(ここでハンドルが取得できない予定が取得出来てしまう)

void OpenMap(ref IntPtr HMap,ref IntPtr LMap, int rLen)
{

HMap = OpenFileMapping(emModGDeclareWinAPI.FILE_MAP_ALL_ACCESS, false, "ABC");
if (HMap==IntPtr.Zero))//<-再度アクセスした場合はハンドルが0になると思うのに取得できてしまう。
{
HMap= CreateFileMapping((UIntPtr)0xFFFFFFFF, IntPtr.Zero, PAGE_READWRITE, 0, rLen, "ABC");//0:異常、0以外:正常
}
LMap = MapViewOfFile(HMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

}

void CloseMap(ref IntPtr HMap, ref IntPtr LMap)
{
CloseHandle(HMap);
UnmapViewOfFile(LMap);
}
void Main()
{
IntPtr Map1;
IntPtr Map2;

OpenMap(ref Map1,ref Map2,10);
CloseMap(ref Map1,ref Map2);
OpenMap(ref Map1,ref Map2,20);
}

出来ればOpenFileMappingで解放しているかを確認したいのですが
別の解放方法があるのでしょうか?
> BOpenFileMappingでアクセス(ここでハンドルが取得できない予定が取得出来てしまう)

  ttp://msdn.microsoft.com/ja-jp/library/cc430039.aspx

  ここの最後のExample が参考になるかと。
  ご確認下さい。

以上。
オショウ様

ご回答ありがとうございます。

例を参考にCreate⇒2重起動検知⇒CloseHandle⇒再度Createと
やってみたのですが、領域の再確保が出来ていないようです。

CloseHandleはTRUEを返しているので成功していると思うのですが
OpenFileMapping ⇒ CloseHandleを交互に繰り返しても
毎回同じハンドルを取得しClose成功となります。

解放せずともファイルマップの取得領域を変更することが
可能であれば問題ないのですが、方法はないでしょうか?
  • 題名: Re[3]: FileMappingの解放
  • 著者: telnet
  • 日時: 2012/06/29 10:52:53
  • ID: 30661
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
CloseHandleで解放できていなかった原因は別プロセスで掴まれているためでした。
勘違いを大変申し訳ありません。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板