VB.NETからDLLの呼び出しについて


VB.NET初心者  2004-05-19 13:47:37  No: 83428  IP: [192.*.*.*]

VB.NETからDLLへ構造体を渡すところで質問させて下さい。

現在、2つの構造体のテーブルをVC++.NETで作成した関数へ渡し、関数内から値を
取得しようとしています。
ところが「TestInfor2」の方は正しい値が取得できるのですが、「TestInfor1」は
はじめのテーブルしか値が入らず、それ以降は値が入りません。
しかもその後、エリアを壊しているようで、例外エラーとなってしまいます。

DLL側で渡された「TestInfor1」の内容を確認すると配列分のアドレスが上手く渡せて
いないように見えました。
試しに「TestInfor1」を渡さないようにしてみると例外エラーも出ず、処理出来ました。

色々と調べてはみたのですが解決方法が見つからず、実際、VB.NETを始めたばかりなの
で何が悪いかも検討がつかない状況です。
些細な事でも構いませんので、どうかお力を貸していただけないでしょうか。

長文で申し訳ありませんが、よろしくお願いします。

--- VB ---
''## 構造体定義 ##
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Public Structure TestInfor1
  <VBFixedArray(63), MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _
  Dim data1() As Byte
  <VBFixedArray(79), MarshalAs(UnmanagedType.ByValArray, SizeConst:=80)> _
  Dim data2() As Byte
  <VBFixedArray(4), MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> _
  Dim data3() As Integer

  Public Sub Initialize()
    ReDim data1(63)
    ReDim data2(79)
    ReDim data3(4)
  End Sub
End Structure

<StructLayout(LayoutKind.Sequential)> _
Public Structure TestInfor2
  Dim data1 As Integer
  Dim data2 As Integer
End Structure

Public Infor1(50) As TestInfor1
Public Infor2(50) As TestInfor2

''## DLL呼び出し ##
TestInfoGet( para1, Infor1(0), Infor2(0) )

''## DLL定義 ##
Public Declare Function TestInfoGet Lib "TestInfo.dll" _
  (ByRef para1 As Integer
    <MarshalAs(UnmanagedType.Struct)> ByRef TInfor1 As TestInfor1, _
    <MarshalAs(UnmanagedType.Struct)> ByRef TInfor2 As TestInfor2) As Integer


--- VC ---
''## 構造体定義 ##
typedef  struct  Infor1 {
  char  Name[64];
  char  BanRyaku[10][8];
  int   BanCode[4];
} TestInfor1 ;

typedef  struct  Infor2 {
  int    data1;
  int    data2;
} TestInfor2 ;

#define DLL_EXPORT  __declspec(dllexport)
DLL_EXPORT int
TestInfoGet(
  int        *para1,
  TestInfor1 *dp1,
  TestInfor2 *dp2
)
{
  for( i = 0; i < 49; i++ )
  {
    memcpy ( dp1, &TestData1[i], sizeof(TestInfor1) );
    dp1++;
  }  

  for( i = 0; i < 49; i++ )
  {
    dp2->data1 = TestData2.data1 ;
    dp2->data2 = TestData2.data2 ;
    dp2++;
  }
}

編集 削除