VB2005でバイト配列をコピーするには


ひよこの弟子  2008-02-13 00:25:47  No: 144418  IP: 192.*.*.*

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

編集 削除
やじゅ  2008-02-13 02:09:21  No: 144419  IP: 192.*.*.*

アライメントあたりが怪しいのかなー
StructLayout(LayoutKind.Sequential, Pack:=1)>

編集 削除
Hongliang  2008-02-13 09:26:25  No: 144420  IP: 192.*.*.*

ByRef As Byte の代わりに ByVal As Byte() を使ったらどうでしょ。
あと SIZE_T は Short じゃないっすよ。

編集 削除