首页 > 解决方案 > 从Delphi到C#的方法数据类型转换

问题描述

抱歉,如果有无法理解或重复的问题!PS我不知道德尔福。

我正在用 C# (WinForms) 为用 Delphi 编写的 DLL 编写程序。在 Delphi 中创建了一个程序,我正在将这些代码改编为 C#。但是在某些数据类型的转换上存在误区。该 DLL 处理发送数据的优缺点。这是Delphi中的代码。

interface
uses Windows,System.Classes,System.SysUtils;

 type
   TaAlignMode=(taLeft,taRight);

   TData=Array[0..312] of Byte;
   TItem=Array[0..4] of Byte;

  TPluData = packed record      
    HotKey:Longint;
    Name: array[0..36] of AnsiChar; 
    LFCode: Longint;
    Code: array[0..10] of AnsiChar; 
    BarCode: Longint;   
    UnitPrice: Longint; 
    WeightUnit: Longint;    
    Deptment: Longint;  
    Tare: Double;   
    ShlefTime: Longint; 
    PackageType: Longint;   
    PackageWeight: Double;
    Tolerance: Longint; 
    Message1: Longint;  
    Message2: Byte; 
    LabelId: Byte;  
    Rebate: ShortInt;   
    Recomdays: Integer; 
    IsLock: Boolean; 
    QtyUnit: Integer; 
    Ice:Double; 
  end;
   TScaleAccount = packed record
    UserID: Longint;  //
    PluName: array[0..36] of AnsiChar; 
    LFCode: Longint;
    UnitPrice: Double; 
    WeightUnit: Longint; 
    TotalPrice: Double; 
    Weight: Double; 
    SaleTime: TDateTime; 
    Rebate: Longint; 
    OnlineTime: TDateTime; 
    Quantity: Longint;
    Clerk: Longint;
//    MarkD: string;
  end;

发送数据的函数如下

//In Delphi given  as
  function rtscaleUploadData(Connid:Integer; Data:PAnsiChar; len:Integer;  Retdata: PAnsiChar): Integer; stdcall;  far; external 'rtslabelscale.dll';

//I converted to C# as following:
[DllImport("rtslabelscale.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern int rtscaleUploadData(
                      int Connid, // Connection ID
                      string Data, // Data for upload
                      int len, // Length of uploaded data
                      string Retdata // return 265byte data without any processing
                      );

并且有下面的代码单元格到这个函数。

//Delphi Code
procedure TFrmMain.btnUploadDataClick(Sender: TObject);
var
  ret:Integer;
  Data:TData;
  retData:TData;
  Str,sRetJson:Ansistring;
  iProtocol:Integer;
  jo:ISuperObject;
  iSendLen:Integer;
  i:Integer;
begin
  if ConnectScale then
  begin
    try
      SetLength(sRetJson,100);
      iProtocol := 0;
      if rtscaleGetScaleType(Connid,PAnsiChar(sRetJson),Length(sRetJson))=0 then  //��ȡ������
      begin
        jo := SO(sRetJson);
        iProtocol := jo.I['Protocol'];
      end;
      Data := getUploadTestData(iProtocol);
      FillChar(retData,SizeOf(retData),0);
      if iProtocol=1 then
       iSendLen := 265
      else
       iSendLen := 261;
       ret := rtscaleUploadData(Connid, @Data,iSendLen,@retData); //retData=265byte use 256
    finally
      rtscaleDisConnect(Connid);
      if (ret=0) then
      begin
        Str:='';
        for i:=0 to iSendLen-1 do
        begin
          Str:=Str+format('%2.2x ',[retData[i]]);
          if(i mod 16 =15)then
          begin
            Str := Str+#13#10;
          end;
        end;
        ShowMessage(Str);
      end;

    end;
  end else
  begin
    ShowMessage('connect Fail');
    exit;
  end;

end;

我将此代码转换为 C#,如下所示(我的数据上传部分有问题,这就是为什么我只显示数据上传部分)。

private Boolean DownloadpluByJson1()
        {
            for (int J = 0; J < 300; J++)
            {
                var obj = new JArray();
                for (int i = 0; i < 4; i++)
                {
                    string s = "pluname" + (J * 4 + i + 1).ToString();
                    int LFCode = J * 4 + i + 1 + 10000;
                    Pludata plu = new Pludata
                    {
                        Name = s,
                        LFCode = LFCode,
                        Code = LFCode.ToString(),
                        BarCode = 40,
                        UnitPrice = 1000,
                        WeightUnit = 4,
                        Deptment = 4,
                        Tare = 0,
                        ShlefTime = 15,
                        PackageType = 5,
                        PackageWeight = 3.2f,
                        Tolerance = 0,
                        Message1 = 1,
                        Message2 = 0,
                        Reserved1 = 0,
                        Reserved2 = 0,
                        MultiLabel = 0,
                        Rebate = 0
                    };

                    string sjson = JsonConvert.SerializeObject(plu);
                    JObject jo = (JObject)JsonConvert.DeserializeObject(sjson);
                    obj.Add(jo);
                }
                //MessageBox.Show(obj.ToString());
                if (rtsdrv.rtscaleUploadData(DeviceConnection.ConnID, obj.ToString(), obj.Count, "256") != 0)
                {
                    MessageBox.Show("Fail");
                    return false;
                }
                else MessageBox.Show("Uploaded");
            }
            return true;
        }

上传秤最多接收 4 条数据,这就是我将所有数据分成 4 条发送的原因。我几乎理解了本节中的所有内容,但有一件事仍不清楚。这里retData: TData;声明了,但我不明白如何在 C# 中声明和使用这部分。我有两个问题:

  1. 我是否正确地将 Delphi 函数转换为 C#?
  2. 如何在已发布的 C# 部分中声明 retData?

标签: c#delphidll

解决方案


推荐阅读