VB代码转Delphi代码,请熟悉两者的高手请进(二):中文问题

马行空牛耕田 2005-07-25 10:51:55
问题情景:
从硬件读取信息,其驱动 sample.dll定义了一个方法:
ReadMsg (
int iPort,
unsigned char * pucCHMsg,
unsigned int * puiCHMsgLen,
unsigned char * pucPHMsg,
unsigned int * puiPHMsgLen,
int iIfOpen
);

我在delphi中对应声明的函数则如下:
Function ReadMsg(iPort : Integer; var CHMsg;var CHMsgLen : Longint; var PHMSg; var PHMsgLen : Longint; iState : Integer) : Integer; stdcall; external 'sample.dll';
调用的时候,我定义了4个参数
CHMsgLen, PHMsgLen : Longint;
TmpCHMsg : array [0.. 256] of byte ;
TmpPHMsg : array [1.. 1024] of byte ;
其余两个参数都是传值。

调用成功后,硬件中读取的文本信息存放到了TmpCHMsg,头30个字节表示姓名,紧接着的2个字节表示婚否;其他字节表示其他信息内容,这里就不详说了。

然后我调用函数,想取头30个字节转换成字符串
TmpCHMsg[31] := $0; //让第31位变成0,当然,事先应该保存该位;
b := WideString(StrPas(@TmpCHMsg)); //b 是一个widestring变量

但是输出的b仍然是乱码。

而VB程序是这样处理的:
Dim TmpPos As Long
TmpPos = 0
ReDim TmpData(1 To 30)
CopyMemory TmpData(1), TmpCHMsg(1), 30
Label2.Caption = StrConv(TmpData, vbWide) '姓名

请问我如何修正自己的Delphi代码,使得可以得到正确的中文?
...全文
249 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jtg98g3 2005-07-27
  • 打赏
  • 举报
回复
vb是双字节的,但有时候又不是,它会使用单字节来表示字符!到底是什么时候是双字节,
什么时候是单字节,只有microsoft才知道。我用的时候是先对每个字节做判断,如果碰到
小于80h的字符,那么该字符为ASCII中可打印字符。否则,就表示该字符跟后面一个字符
组合成一个中文!就这样!
马行空牛耕田 2005-07-27
  • 打赏
  • 举报
回复
嗯,那么可否告知VB代码 TmpStr = StrConv(TmpData, vbWide) 的工作细节呢,我好在Delphi中仿照它实现,谢谢!
马行空牛耕田 2005-07-27
  • 打赏
  • 举报
回复
但是不需要转码(单字节转双字节)吗? 前30位可是中文哦。 Delphi比VB强我知道,但是这里的情况是dll中有了可用的函数,VB调用后,得到数据,进行转换,成功显示中文; 我写的Delphi也是用同一dll的同一个函数,也可以得到数据,不转化输出的字符(乱码)和VB未转换之前的一模一样。

所以我考虑的是,如何转换。
马行空牛耕田 2005-07-26
  • 打赏
  • 举报
回复
Up第二次,晕了,怎么还没有答复,是我的问题描述太繁杂??
mxlinux 2005-07-26
  • 打赏
  • 举报
回复
我觉得这个功能实现没必要用到指针,指针很容易出现乱吗。我一般是用for循环读取string变量每一个位,stirng可以用string[x] 访问每一位数据,这个数据是pchar类型的。比如得到前30位内容

var tmep:string;//临时字串,保存结果
var b:stirng;//原始字符串

tmep:=' ';//初始化超过30位

for i:=1 to 30 do
begin
temp[i]:=b[i];

end;

temp:=Trim(temp);

temp就是前30位的信息了。

可能你遇到的情况比较复杂,思路开阔点,不要钻牛角,delphi比VB强很多,很多东西可以简单实现,不必像VB那样思考问题,祝你好运!!
马行空牛耕田 2005-07-25
  • 打赏
  • 举报
回复
Up第一次(PS.昨天是周末,我发贴后n个人回复我,怎么今天大家都这么忙啊?)

16,741

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧