どなたかご教授下さい。
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件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) 【VBA】 Alt+PrintScreenにてアクティブウィンドウのスクショを貼付する方法 4 2022/12/08 20:53
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba 実数および実数タイプの変...
-
Excelのマクロについて教えてく...
-
VBA レジストリの値の読み方に...
-
Excel VBA 定義されたプロージ...
-
Excel マクロについての相談
-
エクセルVBAについて
-
Vba SelStart、SelLen教えてく...
-
エクセルの合計を自動で表示さ...
-
Excelのマクロでワードのテキス...
-
Excelについて
-
2つのマクロでチェックボックス...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBAの質問になります Userform内で
-
VBA listBoxから
-
VBAで各列の"+"と"o"の合計数を...
-
VBA初心者 Ctrl+での操作、ボタ...
-
VBA 複数条件の分岐処理の上手...
-
VB.net(VB)で、フォームにExcel...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトのキー入力...
-
XMODEMのchecksumの計算方法を...
-
WiFiのプログラミングについて
-
プロトコルの決め方(RS232C)
-
VB2005でバイト配列をコ...
-
USB-CDC通信する場合のパケット...
-
MSN Messenger 起動中にEtherea...
-
伝送速度の実測値と理論値の違...
-
リバースTCP非同期攻撃が検出さ...
-
VRRPとHSRPについて
-
内部告発メールを送る予定。送...
-
知らないWi-Fiに接続してしまい...
-
誹謗中傷について 会社のメール...
-
NEC LL800/KG「ATI Radeon Xpre...
-
サブネットマスクについて
-
ブロードキャストにPINGしたい
-
先ほど買い物中に間違えて鍵が...
-
メールやLINEなど送ったら どこ...
-
イーサネット アダプターとは
-
チーミングに対応してるスイッ...
おすすめ情報