导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2019/8/8 11:13:41
标题:
加入我的收藏
楼主:
我用的D7,调用一个dll。厂家的标准工具vc调用代码如下: sourcestr=(char *)malloc(sizeof(char)*300); memset(sourcestr,0,300); cardid1=(long *)malloc(sizeof(long)); amount1=(long *)malloc(sizeof(long)); order1=(int *)malloc(sizeof(int)); i=HYYZReadCard(nComm,nBaud,sourcestr,cardid1,amount1,order1); 我翻译了后sourcestr这里的数据是能接受到,但是后面的三个参数cardid1,amount1,order1没有数据。都是0.我估计是不是我定义的类型不对。根本就没准确调用动态库,所以没取到数据。对方厂家是说,这3个字段也是传递的地址。 我的代码: function HYYZReadCard(COMID, COMHZ: Integer; readstr:pchar; CardID: pinteger; amount: pinteger; order: pInteger): Integer; stdcall; function HYYZReadCard; external 'XiMei4442.dll' name 'HYYZReadCard'; procedure TYzqtMainForm.btn1Click(Sender: TObject); // var gStat1,gStat2:integer; HYRQ_CardID: integer; //用户卡编号 HYRQ_amount: integer; //购气量 HYRQ_order: integer; //购气次数 readstr: array[0..256] of char; //存放读卡信息 begin gStat1:=HYYZReadCard(0,9600,readstr,@HYRQ_CardID,@HYRQ_amount,@HYRQ_order); if gStat1=0 then begin showmessage('读卡成功!'); showmessage('@用户卡编号@'+inttostr(HYRQ_CardID)+'@@'); showmessage('@购气量@'+inttostr(HYRQ_amount)+'@@'); showmessage('@购气次数@'+inttostr(HYRQ_order)+'@@'); showmessage('@读卡信息:'+readstr+'@'); Einfo:=trim(readstr); end else if gStat1=1 then begin showmessage('读卡器打开异常!'); end end;
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/8 11:22:43
1楼:
long 和 int 在 c 上有没有区别,我不知道。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/8/8 15:01:50
2楼:
我觉得也许你该跟厂家确认一下调用约定是不是stdcall
----------------------------------------------
-
作者:
2019/8/10 8:47:01
3楼:
约定的应该是没问题的,之前都是这么用的。而且,sourcestr这个是成功获取数据了的。如果有问题,函数是不是都应该无法使用。 请大神们帮助一下,是不是我定义的后面三个参数不对。和C里有差错,导致的数据没取到
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/10 9:23:47
4楼:
你用的什么版本的 Delphi? C++ char is always single byte, Delphi'char could be single byte or double byte! 你应该把你 Delphi code的 pchar 改成pansichar Now - please say "Thank you".
----------------------------------------------
-
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2019/8/10 10:00:04
5楼:
sourcestr是指针,delphi的readstr是静态数组,应当是传@readstr
----------------------------------------------
-
作者:
2019/8/12 0:55:49
6楼:
5楼:sourcestr是指针,delphi的readstr是静态数组,应当是传@readstr 数组名就是指针。 @reader 是二级指针, 那就错了。 楼主的错误应该就是 C++的char 是单字节, Delphi 的char 缺省是双字节,他的PChar 应该用PAnsiChar
----------------------------------------------
-
作者:
2019/8/12 9:18:27
7楼:
感谢大家的回答,我现在不是readstr有问题。readstr是获取了正确的数据了。是其他的三个 cardid1=(long *)malloc(sizeof(long)); amount1=(long *)malloc(sizeof(long)); order1=(int *)malloc(sizeof(int)); 是不是这三个我定义得有问题
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/12 10:59:40
8楼:
readstr: array[0..256] of char; ----> 为什么用0..256,不用0..299?
----------------------------------------------
-
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2019/8/12 13:49:31
9楼:
32位系统,C的int和long是没区别的,都是4字节,64位系统,int是4字节,long是8字节。 还有就是6楼说的,如果是用 D2009及以后的版本,要用PAnsiChar 注意下: 当把 静态字符数组或动态字符数组直接传给pchar或pansichar参数的时候,delphi编译后的pchar或pansichar参数会多出几个字节(原因不知道),我是在win10, delphi 10.2.3上试的,如果中间经过string转,就不会多出字节。 另外说下: 6楼说的:"数组名就是指针。 @reader 是二级指针, 那就错了。" 对于char或ansichar数组,当参数是pchar或pansichar的时候,传数组名或@数组名都可以,不会出错。如果不是字符数组,那就不一样了。
----------------------------------------------
-
作者:
2019/8/12 16:25:31
10楼:
1.确认调用方式,一般来说,C或C++写的函数默认是_cdecl,它和_stdcall传参方式一样,只不过不同的是处理堆栈的方式。如果是_cdecl,调用没问题,只不过会出错,但是返回结果肯定是正确的。 2.尝试把HYRQ_CardID,HYRQ_amount,HYRQ_order改成int64,反正传的是地址,内存具体大小无所谓了,测试一下试试。 3.malloc函数,不是你申请4字节的内存,系统就只给你4字节的内存,最低会给你1024大小的内存,这是WINDOWS内存管理方式决定的。
----------------------------------------------
-
作者:
2019/8/12 17:06:23
11楼:
var
----------------------------------------------
-
作者:
2019/8/14 9:07:13
12楼:
感谢大家的回复,我现在就是这段代码里 sourcestr=(char *)malloc(sizeof(char)*300); memset(sourcestr,0,300); cardid1=(long *)malloc(sizeof(long)); amount1=(long *)malloc(sizeof(long)); order1=(int *)malloc(sizeof(int)); i=HYYZReadCard(nComm,nBaud,sourcestr,cardid1,amount1,order1); 这三个参数cardid1,amount1,order1,取不到值。我的写法是不是有问题。 function HYYZReadCard(COMID, COMHZ: Integer; readstr:pchar; CardID: pinteger; amount: pinteger; order: pInteger): Integer; stdcall; gStat1:=HYYZReadCard(0,9600,readstr,@HYRQ_CardID,@HYRQ_amount,@HYRQ_order); 求助大家帮忙翻译,把那段C写成Delphi,我用的delphi7
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/14 12:05:07
13楼:
{ sourcestr=(char *)malloc(sizeof(char)*300); memset(sourcestr,0,300); cardid1=(long *)malloc(sizeof(long)); amount1=(long *)malloc(sizeof(long)); order1=(int *)malloc(sizeof(int)); i=HYYZReadCard(nComm,nBaud,sourcestr,cardid1,amount1,order1); } function HYYZReadCard(COMID, COMHZ: Integer; readstr:pchar; CardID: pinteger; amount: pinteger; order: pInteger): Integer; stdcall; external 'XiMei4442.dll' name 'HYYZReadCard'; procedure TForm1.BitBtn1Click(Sender: TObject); var sourcestr:array [0..300] of char; cardid1 :array [0..1] of integer; amount1 :array [0..1] of integer; order1 :array [0..1] of integer; i:integer; begin FillChar(sourcestr,300,0); i :=HYYZReadCard(0,9600,sourcestr,@cardid1[0],@amount1[0],@order1[0]); //取值.cardid1[0] / amount1[0] / order1[0] end;
----------------------------------------------
-
作者:
2019/8/14 14:07:00
14楼:
感谢楼上的兄弟的指教,我试了下,三个参数还是0. 请教下,cardid1[0] / amount1[0] / order1[0]这样直接取值是不是就是第一位的。并没有整个取到呢。还是我赋值有问题 我是这样直接赋值的 edt2.Text:= trim(inttostr(HYRQ_CardID[0])); 再有,三个参数长度不一。定义为定长的是不是不合适。 感谢
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/14 14:17:18
15楼:
C中,指针就是数组的变型。取不到值,可能是CPU64位关系,你可以试试看cardid1[1] / amount1[1] / order1[1] ;当前他们可以先初始化为0
----------------------------------------------
-
作者:
2019/8/14 14:18:31
16楼:
另外多说一句,串口编号一般1开始,0开始不知道是不是这个参数有问题呢。
----------------------------------------------
-
作者:
2019/8/14 14:21:15
17楼:
除非你的C代码有问题。否则翻译过来就是如此。
----------------------------------------------
-
作者:
2019/8/14 14:36:03
18楼:
感谢阿奇兄弟,您能加我QQ或者微信吗? 25220064,同号。想和您及时沟通,这个问题困扰我几天了。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/14 14:37:04
19楼:
串口和波特率应该是没问题的,读卡有正确返回。加密串sourcestr这个是有数据的
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/8/15 13:11:05
20楼:
你用VC试过吗?
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……