ポインタのキャストについて

解決


あの  2011-06-02 18:42:30  No: 147325

質問失礼いたします。
以下のような構造体が二つあり、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で同様の処理を行うにはどうすればいいのでしょうか?
もし知っている方がいらっしゃればご教授ください。
よろしくおねがいします。


魔界の仮面弁士  2011-06-02 22:44:40  No: 147326

> 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


あの  2011-06-04 00:11:46  No: 147327

魔界の仮面弁士様
回答ありがとうございます。
Classへの変更で無事解決しました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加