ページ 11

OpenFileMapping

Posted: 2013年2月11日(月) 22:53
by Cユーザー
またメモリマップドファイルの方に少し戻っています。
まだ本格的に作りこんではいないのですが問題が発生しました。

共有メモリをCreate、Open、Deleteの3つの関数に1つのクラスにまとめDLL化しました。
CreateにはCreateFileMappingした後MapViewOfFileでマッピング処理をいれています。

OpenにはOpenFileMappingをした後MapViewOfFileでマッピング処理を入れています。

Deleteはオブジェクトの破棄などをいれています。


プロセスAで
SampleClass cls;
cls.Create();

とした後
プロセスBで
SampleClass cls;
cls.Open()

とした際
プロセスACreate内のCreateFileMappingで作成したハンドルとプロセスBOpen内のOpenFileMappingで作成したハンドルでアドレスが
異なります。

原因が知りたいです。
ご教授お願い致します。

Re: OpenFileMapping

Posted: 2013年2月11日(月) 23:05
by Cユーザー
コードはこんな感じになってます。

コード:

long SampleClass::Create()
{
char *test = "test";
	m_handle= CreateFileMapping(
             INVALID_HANDLE_VALUE,
	NULL,
	PAGE_READWRITE,					
             0,
	100,
	test);

	// マッピング開始
	m_mp= (char*)MapViewOfFile(
	m_handle,
	FILE_MAP_ALL_ACCESS, 
             0,
	0,
             100);
              return 0;
}

long SampleClass::Open()
{	
	char* objName =  "test";
	m_handle= OpenFileMapping(
					FILE_MAP_READ, 
					FALSE, 
					objName);

	// マッピング開始
	m_mp= (char *)MapViewOfFile(m_handle,
					FILE_MAP_ALL_ACCESS, 
					0,
					0,
					100);

             return 0;
}


Re: OpenFileMapping

Posted: 2013年2月11日(月) 23:11
by h2so5
Cユーザー さんが書きました: プロセスACreate内のCreateFileMappingで作成したハンドルとプロセスBOpen内のOpenFileMappingで作成したハンドルでアドレスが
異なります。
MSDNを読めば分かりますが、同じファイルマッピングオブジェクトを指しているからといってハンドルまで同じになるとは書いていませんよ。

Re: OpenFileMapping

Posted: 2013年2月11日(月) 23:19
by softya(ソフト屋)
ハンドルをアドレスだと決めつけるのは危険なことですよ。せっかく抽象化しているのに。
あとマッピングされるアドレスも異なるので同じだと決めつけてもいけません。

Re: OpenFileMapping

Posted: 2013年2月11日(月) 23:38
by Cユーザー
おっと、msdnを読んでませんでした。

同じじゃなくてもマッピングできるのかな
ちょとみてみます

Re: OpenFileMapping

Posted: 2013年2月12日(火) 00:10
by Cユーザー
うーん、マッピングできていないです。
どこか間違ってるのかな

Re: OpenFileMapping

Posted: 2013年2月12日(火) 00:59
by Cユーザー
原因がおそらく判明しました。

OpenのOpenFileMappingで読みとりようの設定にしているせいで
そのあとのMappingでアクセスエラーが発生していた

というものだと思います、多分


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

Re: OpenFileMapping

Posted: 2013年2月12日(火) 01:16
by softya(ソフト屋)
OpenFileMappingでFILE_MAP_READにもかかわらず、MapViewOfFileでFILE_MAP_ALL_ACCESSだからエラーなのでは?