如何在c#中像vb6中使用marshal的类型那样做结构数组
本文关键字:类型 数组 结构 marshal 中像 vb6 | 更新日期: 2023-09-27 18:02:53
很抱歉我没有解释清楚。dll不是用VB写的,是用机器语言写的,实际上可以从vb6 delphi 7和c++访问dll。连接方法"PBusConnectEx"在c#代码中可以完美地工作。我真正的问题是,我在vb6中有一个"类型",我不得不在c#中使它成为一个"结构"。
第一个问题是,如果你认为c#中的结构"struct"相当于vb6中的结构"type"。
第二个问题是,如果你认为外部函数声明"PBusTransferPLUCluster"比外部函数声明"PBusTransferPLUCluster"在vb6中做得好。
第三个问题是:与vb6中的PBusTransferPLUCluster函数调用相比,你认为应该如何调用PBusTransferPLUCluster函数和参数类型必须发送?对不起,如果我知道我上面的解释,我是论坛的新手,英语写得不是很好。
VB6 Code Unit1.bas
Attribute VB_Name = "Module1"
Type TPlu
PLUName As String
LFCode As Long
Code As String
BarCode As Long
UnitPrice As Long
WeightUnit As Long
Deptment As Long
Tare As Double
ShlefTime As Long
PackageType As Long
PackageWeight As Double
Tolerance As Long
Message1 As Byte
Reserved As Byte
Reserved1 As Integer
Message2 As Byte
Reserved2 As Byte
MultiLabel As Byte
Rebate As Byte
Account As Long
End Type
Type TPLUCluster
PLU(0 To 3) As TPlu
End Type
Type THotkeyTable
Hotkey(0 To 83) As Long
End Type
Declare Function PBusConnect Lib "PBusDrv.dll" (ByVal RefLFZKFileName As String, ByVal RefCFGFileName As String, ByVal SerialNO As Integer, ByVal CommName As String, ByVal BaudRate As Integer) As Long
Declare Function PBusDisConnect Lib "PBusDrv.dll" (ByVal SerialNO As Integer) As Long
Declare Function PBusTransferPLUCluster Lib "PBusDrv.dll" (ByRef PLUCluster As TPLUCluster) As Long
Declare Function PBusTransferHotkey Lib "PBusDrv.dll" (ByRef HotkeyTable As THotkeyTable, ByVal TableIndex As Long) As Long
Declare Function PBusPLUToStr Lib "PBusDrv.dll" (ByRef PLU As TPlu, ByVal LPStr As String) As Long
Declare Function PBusStrToPLU Lib "PBusDrv.dll" (ByVal LPStr As String, ByRef PLU As TPlu) As Long
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Unit1.frm
VERSION 5.00
Begin VB.Form Form1
Caption = "Sample for Windows NT 4.0"
ClientHeight = 1500
ClientLeft = 1770
ClientTop = 1710
ClientWidth = 2190
LinkTopic = "Form1"
PaletteMode = 1 'UseZOrder
ScaleHeight = 1500
ScaleWidth = 2190
Begin VB.CommandButton TestBtn
Caption = "Test"
Height = 375
Left = 360
TabIndex = 1
Top = 480
Width = 1335
End
Begin VB.Label Label1
AutoSize = -1 'True
Height = 195
Left = 1560
TabIndex = 0
Top = 4560
Width = 45
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub TestBtn_Click()
Dim Result As Long
Dim PLUCluster As TPLUCluster
Dim PLU As TPlu
Dim HotkeyTable As THotkeyTable
Dim Str As String
PLU.PLUName = "chorizoxx"
PLU.LFCode = 1
PLU.Code = 1
PLU.Deptment = 1
PLU.UnitPrice = 21414
PLU.BarCode = 22
PLUCluster.PLU(0) = PLU
Result = PBusConnectEx(".'lfzk.dat", ".'system.cfg", "192.168.1.87")
Result = PBusTransferPLUCluster(PLUCluster)
Result = PBusDisConnect(1234)
Result = MessageBox(0, "Test OK", "Demo", 0)
End Sub
这是我的c#代码:
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
namespace BALANZAC_{
public partial class MainForm : Form{
struct TPlu{
public string PLUName;
public long LFCode;
public string Code;
public long BarCode;
public long UnitPrice;
public long WeightUnit;
public long Deptment;
public double Tare;
public long ShlefTime;
public long PackageType;
public long PackageWeight;
public long Tolerance;
public byte Message1;
public byte Reserved;
public int Reserved1;
public byte Message2;
public byte Reserved2;
public byte MultiLabel;
public byte Rebate;
public long Account;
}
private TPlu PLU;
private TPlu[] PPC=new TPlu[3];
[DllImport("PBusDrv.dll")]
public static extern int PBusConnectEx(string RefLFZKFileName, string RefCFGFileName , string IPAddr);
[DllImport("PBusDrv.dll")]
private static extern int PBusTransferPLUCluster([MarshalAs(UnmanagedType.LPArray, SizeConst=3)]TPlu[] PPC);
public MainForm()
InitializeComponent();
PBusConnectEx("lfzk.dat", "system.cfg", "192.168.1.87");
PLU.PLUName="PRUEBA PESADO X1";
PLU.Code="222";
PLU.LFCode=222;
PLU.Deptment=1;
PLU.UnitPrice=12993;
PLU.BarCode=22;
PPC[0]=PLU;
PLUCluster.PLU[0]=PLU;
}
}
}
如果我不能在上一篇文章中解释我,真的很抱歉。
Vb6中的Int在c#中是Short, Vb6中的Long在c#中是Int
VB6没有像c#那样的64位长
你可以在VB6中为Long (c#)创建一个UDT,
Type VB6Long64
LoValue As Long
HiValue As Long
End Type
参见VB6和VS2005之间的数据类型比较以及如何在vba(即VB6)中做64位