我不看,打死都不看,这种问题太坑爹了。
你说的话我就不喜欢听,什么叫打死都不看,什么叫坑爹,你不看自有人看,你不帮忙自有人帮忙,实在不行,问题先空这,一年之后再来解决
报错的具体内容是什么?
@dudu:
程序是这样调用的:
[DllImport(@"SajetConnect.dll", EntryPoint = "SajetTransData", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern Boolean SajetTransData(int f_iCommandNo, IntPtr f_pData, IntPtr f_pLen);
调用方式:
string s1 = "SAJET001;";
byte[] bArray = new byte[500];
bArray = Encoding.Default.GetBytes(s1);
byte[] bbb = ReadBytesFromPtr(firstAdd, 500);
IntPtr inpPtrTest = new IntPtr();
WriteBytesToPtr(inpPtrTest, bArray);
var sss = SajetTransData(iCommand, inpPtrTest, (IntPtr)f_pLen);还是不对
@范立勇:
将
public static extern Boolean SajetTransData(int f_iCommandNo, IntPtr f_pData, IntPtr f_pLen);
改为:
public static extern Boolean SajetTransData(int f_iCommandNo, [MarshalAs(UnmanagedType.LPStr)] string f_pData, [MarshalAs(UnmanagedType.LPStr)] int f_pLen);
然后直接用int, string, int这三个参数类型调用试试
首先贴出我的测试代码:
delphi:(Delphi指针不太会,还请大神们指点)
unit Unit1; interface uses SysUtils; function SajetTransData(f_iCommandNo:Integer;f_pData,f_pLen:Pointer):Boolean;stdcall; implementation function SajetTransData(f_iCommandNo:Integer;f_pData,f_pLen:Pointer):Boolean; var str,strlen:string; len:Integer; pstr:PChar; plen,i:Integer; begin Result:=False; if f_iCommandNo=1 then begin str:=''; strlen:=''; while Char(f_pData^) <> #0 do begin str := str +string(Char(f_pData^)); inc(Integer(f_pData)); end; while Char(f_pLen^) <> #0 do begin strlen := strlen +string(Char(f_pLen^)); inc(Integer(f_pLen)); end; len:=StrToInt(strlen); str:=#13+'原始字符串:'+str+#13+ '有效长度:'+IntToStr(len); pstr:=PChar(str); plen:=Length(str); for i:=0 to plen do begin Char(f_pData^):=pstr[i]; inc(Integer(f_pData)); end; Char(f_pData^):=#0; end; Result:=True; end; end.
C#测试代码:
private void button2_Click(object sender, EventArgs e) { int f_iCommandNo; StringBuilder f_pData=new StringBuilder(256); StringBuilder f_pLen = new StringBuilder(256); f_iCommandNo = 1; f_pData.Append("123"); f_pData.Append("45"); int len = f_pData.Length; f_pLen.Append(len.ToString()); CallDelphi.SajetTransData(f_iCommandNo,f_pData,f_pLen); MessageBox.Show(f_pData.ToString()); } private class CallDelphi { const string path = "CsharpTest.dll"; [DllImport(path, EntryPoint = "SajetTransData", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern Boolean SajetTransData(int f_iCommandNo, StringBuilder f_pData, StringBuilder f_pLen); }
两个指针都用StringBuild去操作。f_pLen传入int型的即可。
测试结果(第一行为原数据,后面为delphi处理后在原指针上加的内容):
我觉得沙里JIN的回答有点道理。
谢谢
你好,群主,你这个问题,解决了吗?可否赐教一下?