- PR -

VB.NETで構造体の入れ子を行うには

投稿者投稿内容
あまたつ
会議室デビュー日: 2004/02/10
投稿数: 8
投稿日時: 2004-02-10 12:21
下記プログラムの構造体を作成し、CopyMemoryを実行すると

「型 tg1 のフィールド tbl をマーシャリングできません :
この型は構造体フィールドとして、マーシャリングできません。」

と表示されて実行出来ません。

tg1内のtblを配列にしなければ実行出来るのですが、配列にすると
実行出来なくなります。
たぶん、マーシャリングの指定方法がおかしいと思うのですが
どうにもやり方が分かりません。
どなたか御教授願います。

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
ByRef Destination As Byte, ByRef Source As tg1, ByVal Length As Long)

<StructLayout(LayoutKind.Sequential)> Public Structure tg1
<VBFixedArray(1), MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim tbl() As tg2
Dim buf1 As Integer
Dim buf2 As Integer

Public Sub Initialize()
ReDim tbl(1)
End Sub
End Structure

<StructLayout(LayoutKind.Sequential)> Public Structure tg2
Dim buf1 As Integer
Dim buf2 As Integer
End Structure



Dim buf(1000) As Byte
Dim tbl As tg1

tbl.Initialize()

Call CopyMemory(buf(0), tbl, 24)
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-10 13:25
引用:

あまたつさんの書き込み (2004-02-10 12:21) より:
たぶん、マーシャリングの指定方法がおかしいと思うのですが
どうにもやり方が分かりません。
どなたか御教授願います。


MSILはどのようになっていますか?
あまたつ
会議室デビュー日: 2004/02/10
投稿数: 8
投稿日時: 2004-02-10 13:38
引用:

iStationさんの書き込み (2004-02-10 13:25) より:
MSILはどのようになっていますか?


申し訳ありません。
MSILとは何でしょうか?
確認方法はどうすればよろしいのでしょうか。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-10 13:44
引用:

あまたつさんの書き込み (2004-02-10 13:38) より:
引用:

iStationさんの書き込み (2004-02-10 13:25) より:
MSILはどのようになっていますか?


申し訳ありません。
MSILとは何でしょうか?
確認方法はどうすればよろしいのでしょうか。



今後のためにも、せめて、googleでMSILを検索してみるくらいはした方がよろしいのではないかと思われます。

MSILとは・・・
http://www.atmarkit.co.jp/icd/root/63/57773363.html

確認するには・・・
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cptools/html/cpconmsildisassemblerildasmexe.asp

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-10 13:46 ]
あまたつ
会議室デビュー日: 2004/02/10
投稿数: 8
投稿日時: 2004-02-10 13:54
MSILはこんな感じになっています。

[CLS] Module1
| .class private auto ansi sealed
| .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) ...
|___[VCL] tg1
| | .class value nested public sequential ansi sealed
| | extends [mscorlib]System.ValueType
| |___[FLD] buf1 : public int32
| |___[FLD] buf2 : public int32
| |___[FLD] tbl : public marshal( fixed array [2]) valuetype test6.Module1/tg2[]
| |___[MET] Initialize : void()
|
|___[VCL] tg2
| | .class value nested public sequential ansi sealed
| | extends [mscorlib]System.ValueType
| |___[FLD] buf1 : public int32
| |___[FLD] buf2 : public int32
| |___[MET] Initialize : void()
|
|___[STM] CopyMemory : void(unsigned int8&,valuetype test6.Module1/tg1&,int64)

iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-10 14:06
引用:

あまたつさんの書き込み (2004-02-10 12:21) より:
Call CopyMemory(buf(0), tbl, 24)


実行コードのこの部分前後のMSILコードを見たいのですが...
あまたつ
会議室デビュー日: 2004/02/10
投稿数: 8
投稿日時: 2004-02-10 14:26
引用:

iStationさんの書き込み (2004-02-10 14:06) より:
引用:

あまたつさんの書き込み (2004-02-10 12:21) より:
Call CopyMemory(buf(0), tbl, 24)


実行コードのこの部分前後のMSILコードを見たいのですが...


すみません。これでいいでしょうか。

// コード サイズ 46 (0x2e)
.maxstack 3
.locals init ([0] unsigned int8[] buf,
[1] valuetype test6.Module1/tg1 tbl)
IL_0000: nop
IL_0001: ldc.i4 0x3e9
IL_0006: newarr [mscorlib]System.Byte
IL_000b: stloc.0
IL_000c: ldloca.s tbl
IL_000e: call instance void test6.Module1/tg1::Initialize()
IL_0013: nop
IL_0014: ldloc.0
IL_0015: ldc.i4.0
IL_0016: ldelema [mscorlib]System.Byte
IL_001b: ldloca.s tbl
IL_001d: ldc.i8 0x18
IL_0026: call void test6.Module1::CopyMemory(unsigned int8&,
valuetype test6.Module1/tg1&,
int64)
IL_002b: nop
IL_002c: nop
IL_002d: ret
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-10 15:01
引用:

あまたつさんの書き込み (2004-02-10 14:26) より:
...
IL_000e: call instance void test6.Module1/tg1::Initialize()
...
IL_0026: call void test6.Module1::CopyMemory(unsigned int8&,
valuetype test6.Module1/tg1&,
int64)
...



instance void test6.Module1/tg1::Initialize()で生成された配列は
test6.Module1/tg1& のように構造体のへの参照と構造体から配列への
2重参照となり、配列の大きさの情報が失われるため配列のマーシャリ
ングが不能になると思われます。2重参照にならない方法は...
...ちょっと時間が欲しいですね。



[ メッセージ編集済み 編集者: iStation 編集日時 2004-02-10 15:02 ]

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