またメモリマップドファイルの方に少し戻っています。
まだ本格的に作りこんではいないのですが問題が発生しました。
共有メモリを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で作成したハンドルでアドレスが
異なります。
原因が知りたいです。
ご教授お願い致します。
OpenFileMapping
-
Cユーザー
Re: OpenFileMapping
コードはこんな感じになってます。
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
MSDNを読めば分かりますが、同じファイルマッピングオブジェクトを指しているからといってハンドルまで同じになるとは書いていませんよ。Cユーザー さんが書きました: プロセスACreate内のCreateFileMappingで作成したハンドルとプロセスBOpen内のOpenFileMappingで作成したハンドルでアドレスが
異なります。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: OpenFileMapping
ハンドルをアドレスだと決めつけるのは危険なことですよ。せっかく抽象化しているのに。
あとマッピングされるアドレスも異なるので同じだと決めつけてもいけません。
あとマッピングされるアドレスも異なるので同じだと決めつけてもいけません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Cユーザー
Re: OpenFileMapping
原因がおそらく判明しました。
OpenのOpenFileMappingで読みとりようの設定にしているせいで
そのあとのMappingでアクセスエラーが発生していた
というものだと思います、多分
ありがとうございました。
OpenのOpenFileMappingで読みとりようの設定にしているせいで
そのあとのMappingでアクセスエラーが発生していた
というものだと思います、多分
ありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: OpenFileMapping
OpenFileMappingでFILE_MAP_READにもかかわらず、MapViewOfFileでFILE_MAP_ALL_ACCESSだからエラーなのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。