如何在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;

        }
    }   
}

如果我不能在上一篇文章中解释我,真的很抱歉。

如何在c#中像vb6中使用marshal的类型那样做结构数组

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位