tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル共有メモリから構造体を含む構造体を取得したい
記事No10974
投稿日: 2012/12/02(Sun) 14:08
投稿者empty
いつもお世話になります。

以前、こちらの掲示板でご質問させていただき、続けて書くべきか悩んだのですが、
新しく投稿させていただきました。
[前回の質問URL]
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=10967&reno=no&oya=10967&mode=msgview&page=0

c++にてマップドファイルを作成し、VB.netでメモリコピーし、データを確認(参照)する
といったことを行いたいです。
下記のようにc++側で構造体を含む構造体に値をセットし、共有メモリへ書き込んだのですが、
取得方法が分からず、手詰まりしてしまいました。

<c++>-------
// 構造体宣言
typedef    struct SHARED_DATA{
int a;
CHILD b[20];
}
typedef    struct CHILD{
int c;
CHILD_2 d1;
CHILD_2 d2;
}

typedef    struct CHILD_2{
double x;
double y;
double z;
}
//マップドファイルへの書き込み省略
------------


<vb.net>------
'構造体宣言
Structure SHARED_DATA
dim a as Integer
dim b() as CHILD
End Structure

typedef    struct CHILD{
dim c as Integer
dim d1 as POINT
dim d2 as POINT
}

typedef    struct POINT{
Dim x As Double
Dim y As Double
Dim z As Double
}

マップドファイルの読み込み省略
Dim eInfo As SHARED_DATA
ReDim eInfo.b(19)            '配列のメモリ確保

eInfo.a = BitConverter.ToInt32(tBuf, 0)
eInfo.b = BitConverter.ToInt32(tBuf, 4)
------------

aの値を取得することはでき、BitConverter.ToInt32(tBuf, 4)にも
値が入っていることは確認できました。
しかし、どのように構造体b、d1の情報を取得すればよいのかわかりません。

勉強不足でお手数を取らせますが、ご教授の程よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: 共有メモリから構造体を含む構造体を取得したい
記事No10976
投稿日: 2012/12/03(Mon) 01:43
投稿者empty
連投失礼します。
下記漏れがありましたので、追記させていただきます。

環境はc++、VB.net

VB.netのソースに記載してあるTbufには
下記の処理で、マップ度ファイルを読み込んでいます。
--------
hFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, True, MAPPED_FILE_NAME)
fMap = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0)
Marshal.Copy(fMap, tBuf, 0, MemorySize)
--------


今回私がしたいことは難しいことなのでしょうか?
検索はしてみたのですが、勉強不足が相まってか、知りたい情報が見つかりませんでした。

何度も申し訳ございませんが、ご教授いただけませんでしょうか?

[ツリー表示へ]
タイトルRe^2: 共有メモリから構造体を含む構造体を取得したい
記事No10977
投稿日: 2012/12/03(Mon) 09:59
投稿者Hongliang
やり方はいくつかありますが、代表的なのはMarshal.PtrToStructureで丸ごとコピーする方法でしょう。
ただし、固定長配列を扱うには属性を指定する必要があります。詳しくは次のページ以下をよく読んでください。
http://msdn.microsoft.com/ja-jp/library/fzhhdwae.aspx

[ツリー表示へ]
タイトルRe^3: 共有メモリから構造体を含む構造体を取得したい
記事No10978
投稿日: 2012/12/03(Mon) 15:55
投稿者empty
> やり方はいくつかありますが、代表的なのはMarshal.PtrToStructureで丸ごとコピーする方法でしょう。
> ただし、固定長配列を扱うには属性を指定する必要があります。詳しくは次のページ以下をよく読んでください。
> http://msdn.microsoft.com/ja-jp/library/fzhhdwae.aspx

Hongliangさん、ありがとうございます。
ご提示いただいた情報を見てみたのですが、私の勉強不足でどのように使えばよいかわからず、
すぐには使えそうにないです。

せっかくご教授いただいたのに申し訳ありません。

現在、代替策として
> CHILD b[20];
この部分を
double b[20 * 7]; // 7:CHILD構造体に格納される値の個数
とし、構造体を含む構造体で対応せず、配列に格納する手段をとりました。


私が対応できないため、いったん解決とさせてください。
申し訳ございません。
知識を深めたうえで、再度挑戦させていただきたいと思います。
ご協力ありがとうございました。

[ツリー表示へ]