DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: taolimanyuan
今日帖子: 2
在线用户: 1
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/8 11:13:41
标题:
请教大家一下vc代码翻译问题。 浏览:283
加入我的收藏
楼主: 我用的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;
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲▲ -
普通会员
2019/8/8 11:22:43
1楼: long 和 int 在 c 上有没有区别,我不知道。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 scarlette (Scarlette) ▲▲▲▲▲ -
普通会员
2019/8/8 15:01:50
2楼: 我觉得也许你该跟厂家确认一下调用约定是不是stdcall
----------------------------------------------
-
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/10 8:47:01
3楼: 约定的应该是没问题的,之前都是这么用的。而且,sourcestr这个是成功获取数据了的。如果有问题,函数是不是都应该无法使用。

请大神们帮助一下,是不是我定义的后面三个参数不对。和C里有差错,导致的数据没取到
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 wuxinxin (wuxinxin) ▲△△△△ -
注册会员
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
----------------------------------------------
-
作者:
男 wuxinxin (wuxinxin) ▲△△△△ -
注册会员
2019/8/12 0:55:49
6楼: 5楼:sourcestr是指针,delphi的readstr是静态数组,应当是传@readstr

数组名就是指针。 @reader 是二级指针, 那就错了。

楼主的错误应该就是  C++的char 是单字节, Delphi 的char 缺省是双字节,他的PChar 应该用PAnsiChar
----------------------------------------------
-
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/12 9:18:27
7楼: 感谢大家的回答,我现在不是readstr有问题。readstr是获取了正确的数据了。是其他的三个

  cardid1=(long *)malloc(sizeof(long));
  amount1=(long *)malloc(sizeof(long));
  order1=(int *)malloc(sizeof(int));

是不是这三个我定义得有问题
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 wuxinxin (wuxinxin) ▲△△△△ -
注册会员
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的时候,传数组名或@数组名都可以,不会出错。如果不是字符数组,那就不一样了。
----------------------------------------------
-
作者:
男 helyna (Person) ▲▲▲▲▲ -
注册会员
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内存管理方式决定的。
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ▲▲▲▲▲ -
普通会员
2019/8/12 17:06:23
11楼: var
----------------------------------------------
-
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
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
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 mefuleu (阿奇) ▲▲▲▲▲ -
注册会员
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;
----------------------------------------------
-
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/14 14:07:00
14楼: 感谢楼上的兄弟的指教,我试了下,三个参数还是0.

请教下,cardid1[0] / amount1[0] /  order1[0]这样直接取值是不是就是第一位的。并没有整个取到呢。还是我赋值有问题

我是这样直接赋值的  edt2.Text:= trim(inttostr(HYRQ_CardID[0]));

再有,三个参数长度不一。定义为定长的是不是不合适。

感谢
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 mefuleu (阿奇) ▲▲▲▲▲ -
注册会员
2019/8/14 14:17:18
15楼: C中,指针就是数组的变型。取不到值,可能是CPU64位关系,你可以试试看cardid1[1] / amount1[1] /  order1[1] ;当前他们可以先初始化为0
----------------------------------------------
-
作者:
男 mefuleu (阿奇) ▲▲▲▲▲ -
注册会员
2019/8/14 14:18:31
16楼: 另外多说一句,串口编号一般1开始,0开始不知道是不是这个参数有问题呢。
----------------------------------------------
-
作者:
男 mefuleu (阿奇) ▲▲▲▲▲ -
注册会员
2019/8/14 14:21:15
17楼: 除非你的C代码有问题。否则翻译过来就是如此。
----------------------------------------------
-
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/14 14:36:03
18楼: 感谢阿奇兄弟,您能加我QQ或者微信吗? 25220064,同号。想和您及时沟通,这个问题困扰我几天了。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/14 14:37:04
19楼: 串口和波特率应该是没问题的,读卡有正确返回。加密串sourcestr这个是有数据的
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/8/15 13:11:05
20楼: 你用VC试过吗?
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行42.96875毫秒 RSS