C# Delphi到c的数据类型转换方法#

C# Delphi到c的数据类型转换方法#,c#,delphi,dll,C#,Delphi,Dll,抱歉,如果有不可理解或重复的问题!另外,我不知道德尔菲 我正在用C#(WinForms)为用Delphi编写的DLL编写一个程序。已经在Delphi中创建了一个程序,我正在将这些代码改编成C。但在某些数据类型的转换中存在误解。这个DLL处理发送数据的优缺点。下面是Delphi中的代码 interface uses Windows,System.Classes,System.SysUtils; type TaAlignMode=(taLeft,taRight); TData=Ar

抱歉,如果有不可理解或重复的问题!另外,我不知道德尔菲

我正在用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()
{
对于(int J=0;J<300;J++)
{
var obj=新的JArray();
对于(int i=0;i<4;i++)
{
字符串s=“pluname”+(J*4+i+1).ToString();
int LFCode=J*4+i+1+10000;
Pludata plu=新的Pludata
{
Name=s,
LFCode=LFCode,
Code=LFCode.ToString(),
条形码=40,
单价=1000,
重量单位=4,
department=4,
皮重=0,
ShlefTime=15,
PackageType=5,
包装重量=3.2f,
公差=0,
Message1=1,
Message2=0,
预留1=0,
预留2=0,
多标签=0,
返利=0
};
字符串sjson=JsonConvert.SerializeObject(plu);
JObject jo=(JObject)JsonConvert.DeserializeObject(sjson);
对象添加(jo);
}
//Show(obj.ToString());
if(rtsdrv.rtscaleUploadData(DeviceConnection.ConnID,obj.ToString(),obj.Count,“256”)!=0)
{
MessageBox.Show(“失败”);
返回false;
}
else MessageBox.Show(“上传”);
}
返回true;
}
上传秤最多可以接收4条数据,这就是为什么我要发送4条数据的原因。 我几乎理解了这一部分的所有内容,但有一点仍然不清楚。这里
retData:TData已声明,但我无法理解如何在C#中声明和使用此部分。
我有两个问题:

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

  • 试试这个:
    [marshallas(UnmanagedType.LPStr)]string retData
    并告诉我它是否有效。顺便说一句:.net和winforms标记与您的问题无关,请删除它们。@fpiette谢谢,上面的代码没有给出错误
    retData
    正在公布字节数。我感兴趣的问题是这是如何工作的?我给它一个256的值,但事实上Delphi会根据某些东西自动声明字节。我完全不理解你的评论。请重新措辞。
    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;
            }