C# Delphi到c的数据类型转换方法#
抱歉,如果有不可理解或重复的问题!另外,我不知道德尔菲 我正在用C#(WinForms)为用Delphi编写的DLL编写一个程序。已经在Delphi中创建了一个程序,我正在将这些代码改编成C。但在某些数据类型的转换中存在误解。这个DLL处理发送数据的优缺点。下面是Delphi中的代码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
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;
}