- PR -

C#で共有メモリの使用について

1
投稿者投稿内容
tossi
会議室デビュー日: 2007/08/23
投稿数: 2
投稿日時: 2007-08-23 16:01
Windowsで共有メモリを使用したいため
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27142&forum=7
を参考にしてテスト用プログラムを作成しました。

同一プロセス内(CreateFileMappingを実行したプロセス)からの
データ読み込みはできたのですが、他プロセスからの読み込みができません。

現象は
1.OpenFileMappingは成功しています。
(GetLastWin32Errorの戻り値0でハンドルも取得できています)
2.MapViewOfFile実行後のGetLastWin32Errorで[1004]が戻ってきてますが、
ポインタは取得してきています。
3.MapViewOfFileで取得したポインタを利用してMarshal.PtrToStructure
を実行すると例外が発生してしまいます。
(System.AccessViolationException: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。)

現象2で同一プロセスからの呼び出し時はGetLastWin32Errorで[0]が戻ってきているので
MapViewOfFileの使い方がいけないのだろうとは思うのですが、
どこが悪いのか検討がつかず、行き詰ってしまいました。

どなたか、ご意見宜しくお願い致します。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-08-23 16:53
引用:

tossiさんの書き込み (2007-08-23 16:01) より:
MapViewOfFileの使い方がいけないのだろうとは思うのですが、
どこが悪いのか検討がつかず、行き詰ってしまいました。



MapViewOfFileは使ってる人もたくさんいますから、
それ自体は動きます。
「動かない」だけでは何が悪いのか検討つきません。

最小コードが提示されれば何かわかるかもしれません。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-08-23 17:15
こんにちは。

引用:

2.MapViewOfFile実行後のGetLastWin32Errorで[1004]が戻ってきてますが、
ポインタは取得してきています。



「1004」の意味は「ERROR_INVALID_FLAGS:フラグが無効です。」てことですね。
だいたい参考ページで引数に渡しているフラグっておかしくないですか?
tossi
会議室デビュー日: 2007/08/23
投稿数: 2
投稿日時: 2007-08-23 18:56
れいさん

すみません。
リンクを貼っただけで済ましてしまいました。

MapViewOfFileの使用方法(コード)は参照先とまったく同じにしてあります。

抜粋します。
引用:


const UInt32 STANDARD_RIGHTS_REQUIRED = 0x000F0000;
const UInt32 SECTION_QUERY = 0x0001;
const UInt32 SECTION_MAP_WRITE = 0x0002;
const UInt32 SECTION_MAP_READ = 0x0004;
const UInt32 SECTION_MAP_EXECUTE = 0x0008;
const UInt32 SECTION_EXTEND_SIZE = 0x0010;
const UInt32 SECTION_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|
SECTION_MAP_WRITE |
SECTION_MAP_READ |
SECTION_MAP_EXECUTE |
SECTION_EXTEND_SIZE);
const UInt32 FILE_MAP_ALL_ACCESS = SECTION_ALL_ACCESS;

m_memAreaPointer = MapViewOfFile(m_memAreaHandle,SECTION_ALL_ACCESS,0,0,0);






Tdnr_Symさん

フラグに関しては、FILE_MAP_ALL_ACCESSをSECTION_MAP_WRITE(0x0002)
に変更してやってみましたがやはりだめでした。

もう少し詳しくどこら辺がおかしいのか教えていただけないでしょうか。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-08-23 19:51
こんばんは。

引用:

tossiさんの書き込み (2007-08-23 18:56) より:
フラグに関しては、FILE_MAP_ALL_ACCESSをSECTION_MAP_WRITE(0x0002)
に変更してやってみましたがやはりだめでした。



引数にあるSECTION_ALL_ACCESSを見てあれ?とおもいましたが、
調べてみたらSECTION_ALL_ACCESSはFILE_MAP_ALL_ACCESSと同値なんですね。

リンク先にある、CreateFileMappingで指定しているSECTION_ALL_ACCESSがおかしいように思うのですが。
CreateFileMappingでエラーにはなってないとのことですが、
CreateFileMappingとMapViewOfFileでアクセス権に矛盾がでているとか?(ちゃんと見ていないですが)
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-08-23 23:07
http://msdn.microsoft.com/library/ja/jpmemory/html/_win32_createfilemapping.asp?frame=true

SECTION_ なんて定数は使用してないようですが。

[訂正]
失礼しました。OpenFileMapping の方でしたね。
http://msdn.microsoft.com/library/ja/jpmemory/html/_win32_openfilemapping.asp?frame=true
こっちなら確かに FILE_MAP_ALL_ACCESS とか使われてるや。
[/訂正]

[ メッセージ編集済み 編集者: Hongliang 編集日時 2007-08-23 23:52 ]
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-08-24 06:08
引用:

tossiさんの書き込み (2007-08-23 18:56) より:
MapViewOfFileの使用方法(コード)は参照先とまったく同じにしてあります。
抜粋します。



抜粋じゃよくわからないし、
参照先は長いので読む気になれませんでした。

参照先はきちんと動くコードなんでしょうか?
参照先が動いててtossiさんのコードが全く同じで、環境が同じなら動くはずでしょう。
参照先が動いてないなら動かなくても当然ですね。

エラーが1004だとわかってるんですから、
フラグのあらゆる組み合わせを試したらどうですか?
フラグは高々5ビット、OpenFileMappingを入れても8ビット。
2つのプロセス入れても20ビット程度なので
自動でチェックすれば一瞬ですよ。

それと、APIの話ならOSを書いたほうがいいです。
OSによって動かないフラグもあります。
1

スキルアップ/キャリアアップ(JOB@IT)