ag游戏庄闲|官方网站
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
?用户名
?密??码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sy1368364703
今日帖子: 12
在线用户: 20
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil ?
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/8/8 11:13:41
标题:
请教大家一下vc代码翻译问题。 浏览:321
加入我的收藏
楼主: 我用的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 版权所有 页面执行15.625毫秒 RSS