アプリ版:「スタンプのみでお礼する」機能のリリースについて

どなたかご教授下さい。

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

'これ以降は正しくない。(VB6だと正しく設定されている)
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
B.bytrecData(7) =0     A.byte_strTanSeq(3) =48
B.bytrecData(8) =6     A.byte_strTanSeq(4) =55
    ・              ・
    ・              ・

A 回答 (2件)

Option Explicit On


Option Strict On
Option Compare Binary
Option Infer Off

'質問掲示のソースがうまく行かない理由はよくわからん
'この辺勉強してないので。
'とりあえず,適当に弄ってたらうまく行ってしまったパターン。

'何故うまくいかないのかを調べて補足してくれるとありがたい

Imports System.Runtime.InteropServices


Namespace Q3770770A

<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

<StructLayout(LayoutKind.Sequential)> Structure ST_SAKI
Dim lngrecLen As Integer 'データのLength
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData As Byte() 'データ

End Structure



Class Q3770770
Private Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (ByRef Destination As Byte , ByRef _
Source As ST_MOTO , ByVal Length As Integer)


Public Shared Sub Main(args As String())
Dim A As ST_MOTO
Dim B As ST_SAKI

ReDim A.byte_strTranCd(3)
ReDim A.byte_strTanSeq(4)
ReDim A.byte_strTxtNo(1)
ReDim A.byte_strTxtSeq(2)
ReDim B.bytrecData(100)

A.byte_strTranCd(0) = System.Convert.ToByte(80)
A.byte_strTranCd(1) = System.Convert.ToByte(50)
A.byte_strTranCd(2) = System.Convert.ToByte(57)
A.byte_strTranCd(3) = System.Convert.ToByte(50)

'これ以降は正しくない。(VB6だと正しく設定されている)
A.byte_strTanSeq(0) = System.Convert.ToByte(80)
A.byte_strTanSeq(1) = System.Convert.ToByte(87)
A.byte_strTanSeq(2) = System.Convert.ToByte(48)
A.byte_strTanSeq(3) = System.Convert.ToByte(48)
A.byte_strTanSeq(4) = System.Convert.ToByte(55)

A.byte_strTxtNo(0) = System.Convert.ToByte(80)
A.byte_strTxtNo(1) = System.Convert.ToByte(87)

A.byte_strTxtSeq(0) = System.Convert.ToByte(80)
A.byte_strTxtSeq(1) = System.Convert.ToByte(87)
A.byte_strTxtSeq(2) = System.Convert.ToByte(48)

Call CopyMemory(B.bytrecData(0), A.byte_strTranCd(0), 14)
For i As Integer = 0 To 13
System.Console.WriteLine(i.toString & ":" & B.bytrecData(i).toString())
Next
System.Console.ReadKey(True)

End Sub

End Class
End Namespace
    • good
    • 0

訂正:



A.byte_strTranCd(0)
ではなく
A
です。
例によって何故動作するかわからんけど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!