- - PR -
C#で共有メモリの使用について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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の使い方がいけないのだろうとは思うのですが、 どこが悪いのか検討がつかず、行き詰ってしまいました。 どなたか、ご意見宜しくお願い致します。 | ||||
|
投稿日時: 2007-08-23 16:53
MapViewOfFileは使ってる人もたくさんいますから、 それ自体は動きます。 「動かない」だけでは何が悪いのか検討つきません。 最小コードが提示されれば何かわかるかもしれません。 | ||||
|
投稿日時: 2007-08-23 17:15
こんにちは。
「1004」の意味は「ERROR_INVALID_FLAGS:フラグが無効です。」てことですね。 だいたい参考ページで引数に渡しているフラグっておかしくないですか? | ||||
|
投稿日時: 2007-08-23 18:56
れいさん
すみません。 リンクを貼っただけで済ましてしまいました。 MapViewOfFileの使用方法(コード)は参照先とまったく同じにしてあります。 抜粋します。
Tdnr_Symさん フラグに関しては、FILE_MAP_ALL_ACCESSをSECTION_MAP_WRITE(0x0002) に変更してやってみましたがやはりだめでした。 もう少し詳しくどこら辺がおかしいのか教えていただけないでしょうか。 | ||||
|
投稿日時: 2007-08-23 19:51
こんばんは。
引数にあるSECTION_ALL_ACCESSを見てあれ?とおもいましたが、 調べてみたらSECTION_ALL_ACCESSはFILE_MAP_ALL_ACCESSと同値なんですね。 リンク先にある、CreateFileMappingで指定しているSECTION_ALL_ACCESSがおかしいように思うのですが。 CreateFileMappingでエラーにはなってないとのことですが、 CreateFileMappingとMapViewOfFileでアクセス権に矛盾がでているとか?(ちゃんと見ていないですが) | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2007-08-24 06:08
抜粋じゃよくわからないし、 参照先は長いので読む気になれませんでした。 参照先はきちんと動くコードなんでしょうか? 参照先が動いててtossiさんのコードが全く同じで、環境が同じなら動くはずでしょう。 参照先が動いてないなら動かなくても当然ですね。 エラーが1004だとわかってるんですから、 フラグのあらゆる組み合わせを試したらどうですか? フラグは高々5ビット、OpenFileMappingを入れても8ビット。 2つのプロセス入れても20ビット程度なので 自動でチェックすれば一瞬ですよ。 それと、APIの話ならOSを書いたほうがいいです。 OSによって動かないフラグもあります。 |
1