0

以下のコード スニペットは、dll で定義されている C API からポインターを取得します。マーシャリングを使用して、私の要件である構造配列を取得しようとしています。

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Public Class vb_menu_dotnet
Public level As Short
Public menu_id As String
End Class
Dim current As IntPtr
Dim outArray As IntPtr
Dim manArray(100) As vb_menu_dotnet
vb_dotnet_get_menu_hierarchy(p_menu_handle, p_apl_id, outArray) //C API call
current = outArray
Dim j As Integer
For j = 1 To 100
manArray(j) = New vb_menu_dotnet()
Marshal.PtrToStructure(current, manArray(j)) //Access Violation Exception

C API のプロトタイプは次のとおりです。

vb_dotnet_get_menu_hierarchy(tcodss_handle_t p_menu_handle,char* p_apl_id,vb_menu_dotnet** p_menu_array)
Structure defination :
typedef struct {
short level;
char* menu_id;
} vb_menu_dotnet;
 

dll と上記のコードの両方が x86 オプションでビルドされている場合、同じコード スニペットが機能します。しかし、x64 オプションで実行すると、Marshal.PtrToStructure(current, manArray(j)) で AccessViolation 例外が発生します。

注: VS2010、フレームワーク 4.0、Windows 7 64 ビット OS を使用

4

0 に答える 0