public struct PTask
{
public IntPtr command; // 命令,4位
public IntPtr taskType; // 任务类型,4位
public IntPtr taskID; // 任务ID,32位
public IntPtr srcTaskID; // 最初任务ID,32位
public IntPtr srcRequesterID; // 最初请求方ID,12位
public IntPtr senderID; // 发送方ID,12位
public IntPtr receiverID; // 接收方ID,每个12位
public IntPtr priority; // 优先级,1位
public IntPtr isACK; // 是否要求回执,1位
public IntPtr invalidation; // 失效时间,13位
public IntPtr sentTime; // 数据发送时间,14位
public IntPtr taskName; // 任务名称,32位
public IntPtr taskBody; // 任务体
}
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr sendTask(ref PTask task, IntPtr ip, IntPtr port);
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr receiveTask(ref PTask task, IntPtr ip, IntPtr port, ref bool other);
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern string errorCodeTrans(IntPtr name);
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern string free_char(IntPtr name); public string GetPCI(string sCode)
{
string result = string.Empty;
PTask oTask;
PTask oTask2;
IntPtr iTask = IntPtr.Zero;
IntPtr iRet = IntPtr.Zero;
string sError = string.Empty;
string sRet = string.Empty;
string sTask = string.Empty;
bool bTmp;
int i = 0;
IntPtr sIp = IntPtr.Zero;
IntPtr sPort = IntPtr.Zero;
try
{
result = "";
oTask = new PTask();
oTask.senderID = Marshal.StringToHGlobalAnsi(PopSendId);
oTask.receiverID = Marshal.StringToHGlobalAnsi(PopReceiveId);
oTask.taskName = Marshal.StringToHGlobalAnsi("query");
oTask.taskBody = Marshal.StringToHGlobalAnsi(GetBody(sCode));
//oTask.taskBody = Marshal.StringToCoTaskMemAuto(GetBody(sCode));
sIp = Marshal.StringToHGlobalAnsi(PopIp);
sPort = Marshal.StringToHGlobalAnsi(PopPort);
iTask = sendTask(ref oTask, sIp, sPort);
sTask = Marshal.PtrToStringAnsi(iTask);
if (sTask.Length != 32)
{
sError = errorCodeTrans(iTask);
free_char(iTask);
}
bTmp = true;
oTask2 = new PTask();
oTask2.senderID = Marshal.StringToHGlobalAnsi(PopSendId);
oTask2.receiverID = Marshal.StringToHGlobalAnsi(PopReceiveId);
oTask2.taskName = Marshal.StringToHGlobalAnsi("query");
oTask2.taskBody = Marshal.StringToHGlobalAnsi("");
oTask2.srcTaskID = Marshal.StringToHGlobalAnsi(sTask.Substring(0, sTask.Length - 1));
//free_char(iTask);
Thread.Sleep(3000);
for (i = 1; i <= 20; i++)
{
iRet = receiveTask(ref oTask2, sIp, sPort, ref bTmp);
sRet = Marshal.PtrToStringAnsi(iRet);
if (sRet != null)
{
if (sRet.Length == 4)
{
sError = errorCodeTrans(iTask);
free_char(iRet);
//Units.uUserThread.error(sError);
}
else
{
result = sRet;
free_char(iRet);
}
break;
}
}
}
catch (Exception Ex)
{
throw new Exception(Ex.Message);
}
return result;
} TTask=record
command:pchar; // 命令,4位
taskType:pchar; // 任务类型,4位
taskID:pchar; // 任务ID,32位
srcTaskID:pchar; // 最初任务ID,32位
srcRequesterID:pchar; // 最初请求方ID,12位
senderID:pchar ; // 发送方ID,12位
receiverID:pchar; // 接收方ID,每个12位
priority:pchar; // 优先级,1位
isACK:pchar; // 是否要求回执,1位
invalidation:pchar; // 失效时间,13位
sentTime:pchar; // 数据发送时间,14位
taskName:pchar; // 任务名称,32位
taskBody:pchar; // 任务体
end;
function sendTask(task:PTask;ip:pchar;port:pchar):pchar;cdecl;external 'PCI2.DLL';
function receiveTask(task:PTask;ip:pchar;port:pchar;other:PBool):pchar;cdecl;external 'PCI2.DLL';
function errorCodeTrans(name:pchar):pchar;cdecl;external 'PCI2.DLL';
function free_char(name:pchar):pchar;cdecl;external 'PCI2.DLL';
function TPopThread.GetPCI(sCode: String):String;
var
oTask,oTask2:TTask;
sTask,sError,sRet:pchar;
bTmp:boolean;
i:integer;
sIp,sPort:pchar;
begin
try
try
Result:='';
ZeroMemory(@oTask,SizeOf(TTask));
oTask.senderID:=pchar(Global.GetConfig('PopSendId'));
oTask.receiverID:=pchar(Global.GetConfig('PopReceiveId'));
oTask.taskName:='query';
oTask.taskBody:=pchar(getBody(sCode));
sIp:=pchar(Global.GetConfig('PopIp'));
sPort:=pchar(Global.GetConfig('PopPort'));
sTask:=sendTask(@oTask,sIP,sPort);
try
if length(sTask)<>32 then
begin
sError:=errorCodeTrans(sTask);
free_char(sTask);
error(sError);
end;
finally
//free_char(sTask);
end;
bTmp:=true;
ZeroMemory(@oTask2,SizeOf(TTask));
oTask2.senderID:=pchar(Global.GetConfig('PopSendId'));
oTask2.receiverID:=pchar(Global.GetConfig('PopReceiveId'));
oTask2.taskName:='query';
oTask2.taskBody:='';
oTask2.srcTaskID:=PChar(Copy(sTask,1,Length(sTask)));
free_char(sTask);
Sleep(StrToInt(Global.GetConfig('PopSleepTime')));
for i:=1 to 20 do
begin
sRet:=ReceiveTask(@oTask2,pchar(sIp),pchar(sPort),@bTmp);
if sRet<>nil then
try
if length(sRet)=4 then
begin
sError:=errorCodeTrans(sTask);
free_char(sRet);
error(sError);
end
else
begin
Result:=sRet;
free_char(sRet);
end;
break;
finally
//free_char(sRet);
end;
Sleep(StrToInt(Global.GetConfig('PopSleepTime')));
end;
except
on Ex:Exception do
begin
RaiseError(Ex,'GetPCI');
end;
end;
finally end;
end;
2个都是调用的c++动态库 ,delphi运行正常 , c#返回的是请求报文格式不正确 , 求大佬帮帮忙
{
public IntPtr command; // 命令,4位
public IntPtr taskType; // 任务类型,4位
public IntPtr taskID; // 任务ID,32位
public IntPtr srcTaskID; // 最初任务ID,32位
public IntPtr srcRequesterID; // 最初请求方ID,12位
public IntPtr senderID; // 发送方ID,12位
public IntPtr receiverID; // 接收方ID,每个12位
public IntPtr priority; // 优先级,1位
public IntPtr isACK; // 是否要求回执,1位
public IntPtr invalidation; // 失效时间,13位
public IntPtr sentTime; // 数据发送时间,14位
public IntPtr taskName; // 任务名称,32位
public IntPtr taskBody; // 任务体
}
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr sendTask(ref PTask task, IntPtr ip, IntPtr port);
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr receiveTask(ref PTask task, IntPtr ip, IntPtr port, ref bool other);
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern string errorCodeTrans(IntPtr name);
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern string free_char(IntPtr name); public string GetPCI(string sCode)
{
string result = string.Empty;
PTask oTask;
PTask oTask2;
IntPtr iTask = IntPtr.Zero;
IntPtr iRet = IntPtr.Zero;
string sError = string.Empty;
string sRet = string.Empty;
string sTask = string.Empty;
bool bTmp;
int i = 0;
IntPtr sIp = IntPtr.Zero;
IntPtr sPort = IntPtr.Zero;
try
{
result = "";
oTask = new PTask();
oTask.senderID = Marshal.StringToHGlobalAnsi(PopSendId);
oTask.receiverID = Marshal.StringToHGlobalAnsi(PopReceiveId);
oTask.taskName = Marshal.StringToHGlobalAnsi("query");
oTask.taskBody = Marshal.StringToHGlobalAnsi(GetBody(sCode));
//oTask.taskBody = Marshal.StringToCoTaskMemAuto(GetBody(sCode));
sIp = Marshal.StringToHGlobalAnsi(PopIp);
sPort = Marshal.StringToHGlobalAnsi(PopPort);
iTask = sendTask(ref oTask, sIp, sPort);
sTask = Marshal.PtrToStringAnsi(iTask);
if (sTask.Length != 32)
{
sError = errorCodeTrans(iTask);
free_char(iTask);
}
bTmp = true;
oTask2 = new PTask();
oTask2.senderID = Marshal.StringToHGlobalAnsi(PopSendId);
oTask2.receiverID = Marshal.StringToHGlobalAnsi(PopReceiveId);
oTask2.taskName = Marshal.StringToHGlobalAnsi("query");
oTask2.taskBody = Marshal.StringToHGlobalAnsi("");
oTask2.srcTaskID = Marshal.StringToHGlobalAnsi(sTask.Substring(0, sTask.Length - 1));
//free_char(iTask);
Thread.Sleep(3000);
for (i = 1; i <= 20; i++)
{
iRet = receiveTask(ref oTask2, sIp, sPort, ref bTmp);
sRet = Marshal.PtrToStringAnsi(iRet);
if (sRet != null)
{
if (sRet.Length == 4)
{
sError = errorCodeTrans(iTask);
free_char(iRet);
//Units.uUserThread.error(sError);
}
else
{
result = sRet;
free_char(iRet);
}
break;
}
}
}
catch (Exception Ex)
{
throw new Exception(Ex.Message);
}
return result;
} TTask=record
command:pchar; // 命令,4位
taskType:pchar; // 任务类型,4位
taskID:pchar; // 任务ID,32位
srcTaskID:pchar; // 最初任务ID,32位
srcRequesterID:pchar; // 最初请求方ID,12位
senderID:pchar ; // 发送方ID,12位
receiverID:pchar; // 接收方ID,每个12位
priority:pchar; // 优先级,1位
isACK:pchar; // 是否要求回执,1位
invalidation:pchar; // 失效时间,13位
sentTime:pchar; // 数据发送时间,14位
taskName:pchar; // 任务名称,32位
taskBody:pchar; // 任务体
end;
function sendTask(task:PTask;ip:pchar;port:pchar):pchar;cdecl;external 'PCI2.DLL';
function receiveTask(task:PTask;ip:pchar;port:pchar;other:PBool):pchar;cdecl;external 'PCI2.DLL';
function errorCodeTrans(name:pchar):pchar;cdecl;external 'PCI2.DLL';
function free_char(name:pchar):pchar;cdecl;external 'PCI2.DLL';
function TPopThread.GetPCI(sCode: String):String;
var
oTask,oTask2:TTask;
sTask,sError,sRet:pchar;
bTmp:boolean;
i:integer;
sIp,sPort:pchar;
begin
try
try
Result:='';
ZeroMemory(@oTask,SizeOf(TTask));
oTask.senderID:=pchar(Global.GetConfig('PopSendId'));
oTask.receiverID:=pchar(Global.GetConfig('PopReceiveId'));
oTask.taskName:='query';
oTask.taskBody:=pchar(getBody(sCode));
sIp:=pchar(Global.GetConfig('PopIp'));
sPort:=pchar(Global.GetConfig('PopPort'));
sTask:=sendTask(@oTask,sIP,sPort);
try
if length(sTask)<>32 then
begin
sError:=errorCodeTrans(sTask);
free_char(sTask);
error(sError);
end;
finally
//free_char(sTask);
end;
bTmp:=true;
ZeroMemory(@oTask2,SizeOf(TTask));
oTask2.senderID:=pchar(Global.GetConfig('PopSendId'));
oTask2.receiverID:=pchar(Global.GetConfig('PopReceiveId'));
oTask2.taskName:='query';
oTask2.taskBody:='';
oTask2.srcTaskID:=PChar(Copy(sTask,1,Length(sTask)));
free_char(sTask);
Sleep(StrToInt(Global.GetConfig('PopSleepTime')));
for i:=1 to 20 do
begin
sRet:=ReceiveTask(@oTask2,pchar(sIp),pchar(sPort),@bTmp);
if sRet<>nil then
try
if length(sRet)=4 then
begin
sError:=errorCodeTrans(sTask);
free_char(sRet);
error(sError);
end
else
begin
Result:=sRet;
free_char(sRet);
end;
break;
finally
//free_char(sRet);
end;
Sleep(StrToInt(Global.GetConfig('PopSleepTime')));
end;
except
on Ex:Exception do
begin
RaiseError(Ex,'GetPCI');
end;
end;
finally end;
end;
2个都是调用的c++动态库 ,delphi运行正常 , c#返回的是请求报文格式不正确 , 求大佬帮帮忙
public struct PTask
[DllImport("PCI2.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr sendTask(IntPtr task, IntPtr ip, IntPtr port);
sPort = Marshal.StringToHGlobalAnsi(PopPort);
IntPtr intpt = Marshal.AllocHGlobal(Marshal.SizeOf(oTask)); //对intpt分配内存
iTask = sendTask(intpt, sIp, sPort);
sTask = Marshal.PtrToStringAnsi(iTask);
大哥 你有企鹅什么的吗
如果还不行,你可以考虑用一下unsafe
public unsafe struct PTask
{
public byte *command;
public byte *taskType;
// ...
}