質問失礼いたします。
以下のような構造体が二つあり、Struct2のポインタをStruct1のポインタへキャストする方法が分からなく困っています。
開発環境はOSがWindows7,VB2005です。
'構造体1
Public Structure STRUCT1
Dim wVersion As Short
Dim funcCount As Integer
End Structure
'構造体2
Public Structure STRUCT2
Dim funcHeader As STRUCT1
Dim Function1 As CallBack1
Dim Function2 As CallBack2
End Structure
Public Shared mStruct1 As STRUCT1
Public Shared mStruct2 As STRUCT2
Sub Main()
Call Test()
End Sub
Sub Test()
Dim mvStruct1Address As IntPtr
Dim mvStruct2Address As IntPtr
'構造体1に値をセット
With mStruct1
.wVersion = &H100
.funcCount = 2
End With
'構造体2に値をセット
With mStruct2
.funcHeader = mStruct1
.Function1 = AddressOf SaveImages
.Function2 = AddressOf PrintImages
End With
'構造体1のポインタを取得
mvStruct1Address = Marshal.AllocHGlobal(Marshal.SizeOf(mStruct1))
Marshal.StructureToPtr(mStruct1, mvStruct1Address, False)
'構造体2のポインタを取得
mvStruct2Address = Marshal.AllocHGlobal(Marshal.SizeOf(mStruct2))
Marshal.StructureToPtr(mStruct2, mvStruct2Address, False)
'構造体2のポインタを構造体1ポインタへのキャスト?
End Sub
VC++では、
(STRUCT1 *)&mStruct2
と書けばいいようなのですが、VB.NETで同様の処理を行うにはどうすればいいのでしょうか?
もし知っている方がいらっしゃればご教授ください。
よろしくおねがいします。
> Struct2のポインタをStruct1のポインタへキャストする方法が分からなく困っています。
Struct2 の先頭に、Struct1 があるのですよね。
先頭部分だけを一致させるなら、ポインタ操作は不要で、
'Struct2 → Struct1
mStruct1 = mStruct2.funcHeader
だけで OK です。逆方向に対しては
'Struct1 → Struct2
mStruct2.funcHeader = mStruct1
ですね。
もしもデータをコピーするという意味では無く、参照自体を
一致させたいのであれば、STRUCT1 を Class に変更すれば OK かと。
> もし知っている方がいらっしゃればご教授ください。
http://www.tt.rim.or.jp/~rudyard/torii009.html
魔界の仮面弁士様
回答ありがとうございます。
Classへの変更で無事解決しました。