VB2005でバイト配列をコピーするには
どなたかご教授下さい。
VB6で作成したプログラムをVB2005にコンバートしました。構造体からなる配列変数を一つの配列変数にコピー
したいのですが、構造体の最初のメンバーだけ値が同じで以降の値は正しくセットされていませんでした。
どのように記述したらよいのでしょうか。またCopymMemory以外で良い方法があればご教授下さい。
よろしくお願い致します。実際のソースも最後にのせました。
===概略===
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Byte, ByRef Source As Byte, ByVal Length As Short)
構造体定義
(コピー元)
<StructLayout(LayoutKind.Sequential)>Structure ST_MOTO
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim byte_strTranCd() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Dim byte_strTanSeq() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim byte_strTxtNo() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim byte_strTxtSeq() As Byte
End Structure
Dim A As ST_MOTO
(コピー先)
<StructLayout(LayoutKind.Sequential)> Structure ST_SAKI
Dim lngrecLen As Integer 'データのLength
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData() As Byte 'データ
End Structure
Dim B As ST_SAKI
Call CopyMemory(B.bytrecData(0), A.byte_strTranCd(0), 14)
出力結果
B.bytrecData(0) =80 A.byte_strTranCd(0) =80
B.bytrecData(1) =50 A.byte_strTranCd(1) =50 '最初の構造体のメンバーの値は正しく設定されている
B.bytrecData(2) =57 A.byte_strTranCd(2) =57
B.bytrecData(3) =50 A.byte_strTranCd(3) =50
B.bytrecData(4) =0 A.byte_strTanSeq(0) =80
B.bytrecData(5) =0 A.byte_strTanSeq(1) =87
B.bytrecData(6) =0 A.byte_strTanSeq(2) =48 'これ以降は正しくない。(VB6だと正しく設定されている)
B.bytrecData(7) =0 A.byte_strTanSeq(3) =48
B.bytrecData(8) =6 A.byte_strTanSeq(4) =55
・ ・
・ ・
VB6ソース
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Integer)
Type BYTE_RQ_H
byte_strTranCd(3) As Byte
byte_strTanSeq(4) As Byte
byte_strTxtNo(1) As Byte
byte_strTxtSeq(2) As Byte
End Type
Type BYTE_RQ
byte_AREA_H As BYTE_RQ_H
End Type
Dim byte_Send As BYTE_RQ
Type REC_HOST
lngrecLen As Long 'データのLength
bytrecData(99) As Byte 'データ
End Type
Dim HostSend As REC_HOST
Sub SendData
'以下処理の実行前に変数の初期化並びに、byte_Send.byte_AREA_Hの各変数には値が設定されています。
Call CopyMemory(HostSend.bytrecData(0), byte_Send.byte_AREA_H.byte_strTranCd(0), 14)
End Sub
VB2005ソース
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Byte, ByRef Source As Byte, ByVal Length As Short)
<StructLayout(LayoutKind.Sequential)>Structure BYTE_RQ_H
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim byte_strTranCd() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Dim byte_strTanSeq() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim byte_strTxtNo() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim byte_strTxtSeq() As Byte
End Structure
Structure BYTE_RQ
byte_AREA_H As BYTE_RQ_H
End Type
Dim byte_Send As BYTE_RQ
<StructLayout(LayoutKind.Sequential)> Structure REC_HOST '送受信用レコード
Dim lngrecLen As Integer 'データのLength
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData() As Byte 'データ
End Structure
Dim HostSend As REC_HOST
Sub SendData
'以下処理の実行前に変数の初期化並びに、byte_Send.byte_AREA_Hの各変数には値が設定されています。
Call CopyMemory(HostSend.bytrecData(0), byte_Send.byte_AREA_H.byte_strTranCd(0), 14)
End Sub
アライメントあたりが怪しいのかなー
StructLayout(LayoutKind.Sequential, Pack:=1)>
ByRef As Byte の代わりに ByVal As Byte() を使ったらどうでしょ。
あと SIZE_T は Short じゃないっすよ。