请问vb->delphi中的字符串用pchar还是string,为什么我下面的vb转换delphi代码不行?

syswer 2001-12-27 05:18:34
Declare Function write_card Lib "STICCW32.DLL" (ByVal hiCC%, ByVal zone%, ByVal addr%, ByVal data_len%, ByVal dat$) As Integer

Private Sub Command8_Click()
Dim sTmp As String
sTmp = Trim(Text7.Text)
nstatus% = write_card(nhiCC, 0, 32, 10, sTmp)
If nstatus = 0 Then
MsgBox "OK!"
Else
MsgBox "error!"
End If
end sub
出错的原因在于不知sTmp变量为什么类型?以及dll文件函数中的dat为何类型?
...全文
161 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
甜而不腻 2001-12-27
  • 打赏
  • 举报
回复
傻!
syswer 2001-12-27
  • 打赏
  • 举报
回复
function write_card ( hiCC :integer; zone : integer; addr : integer;
data_len : integer; dat : pchar) : Integer; stdCall;external 'STICCW32.DLL';
procedure TForm1.Button6Click(Sender: TObject);
var
datt : pchar;
stay : integer;
len : integer;
begin
stay:=strtoint(edit3.Text );
len:=strtoint(edit4.Text );
datt:=pchar(trim(edit5.Text));
if stay>=32 then
begin
if len<20 then
begin
nstatus := write_card(nhicc,0,32,10,datt);
if nstatus=0 then
edit1.Text :=datt
else edit1.text :=inttostr ( nstatus );
end;
end;
end;

可是发现edit1.text显示的字符串都变成乱码了,请问我该怎么办?
王集鹄 2001-12-27
  • 打赏
  • 举报
回复
function read_card(hiCC: Word; zone: Word; addr: Word; data_len: Word; dat: PChar): Integer; stdcall; external 'STICCW32.DLL';
//Declare Function write_card Lib "STICCW32.DLL" (ByVal hiCC%, ByVal zone%, ByVal addr%, ByVal data_len%, ByVal dat$) As Integer
function write_card(hiCC: Word; zone: Word; addr: Word; data_len: Word; dat: PChar): Integer; stdcall; external 'STICCW32.DLL';
//Declare Function write_card Lib "STICCW32.DLL" (ByVal hiCC%, ByVal zone%, ByVal addr%, ByVal data_len%, ByVal dat$) As Integer

procedure TForm1.Button1Click(Sender: TObject);
//Private Sub Command8_Click()
var
sTmp: PChar;
nstatus: Integer;
nhiCC: Integer;
begin
sTmp := PChar(Trim(Edit1.Text));
nstatus := write_card(nhiCC, 0, 32, 10, sTmp);
If nstatus = 0 Then
ShowMessage('OK!')
Else ShowMessage('error!')
end;

chrisz 2001-12-27
  • 打赏
  • 举报
回复
PChar(String类型)即可为PChar
nbwzw 2001-12-27
  • 打赏
  • 举报
回复
动态连接库一般都是用C++写的,主要是指针类型应该用PChar类型
syswer 2001-12-27
  • 打赏
  • 举报
回复
zswang(伴水)(被黑中):你好,
请你再帮我把上面的代码在转换一下好吗,谢谢,我改的中编译通不过。
王集鹄 2001-12-27
  • 打赏
  • 举报
回复
动态连接库里的字符串一般都是PChar
******************************************************************************* * * * 摘 要: 本程序主要是通过调用MF1_AnLock2009.dll动态连接库函数,进行读写卡操作 * * * * 创建日期: 2006年07月19日 * 修改日期: 2009年02月17日 * * ******************************************************************************** //********************************************************** //************************************* //******************* //MF1卡通用接口 //******************* //************************************* //********************************************************** //****************************** * 返回值说明 : 整型(Integer) * -1 ---- 串口打开失败 * -2 ---- 无效卡片 * -3 ---- 软件未注册 * 0 ---- 写卡失败 * 1 ---- 成功 //****************************** function UGA_ModiPSW ( CommID :Integer; MF_Area :Byte; OldPSW, NewPSW :PChar ) : Integer; 功能: 修改分区密码 参数: CommID 端口号(1-4) MF_Area MF1区号(0-15) OldPSW 旧密码(最大长度6字节) NewPSW 新密码(最大长度6字节) function UGA_ReadCard( CommID :Integer; MF_Area :Byte; CurrPSW, CardCode, CardInfo :PChar ) : Integer; 功能: 读卡片信息 参数: CommID 端口号(1-4) MF_Area MF1区号(0-15) CurrPSW 当前密码(最大长度6字节) CardCode 读出的卡号(固定8字节) CardInfo 读出的卡片信息(16字节 * 3扇区 = 48字节) function UGA_WriteCard( CommID :Integer; MF_Area :Byte; CurrPSW, CardInfo :PChar ) :Integer; 功能: 读卡片信息 参数: CommID 端口号(1-4) MF_Area MF1区号(0-15) CurrPSW 当前密码(最大长度6字节) CardInfo 写入的卡片信息(16字节 * 3扇区 = 48字节) //********************************************************** //************************************* //******************* //MF1卡门锁专用接口 //******************* //************************************* //********************************************************** ************************************************************** * 函数功能 : 读取卡片信息 * 参数说明 : CommID(整型) ---- 端口编号 * CardType(整型) ---- 卡片类型(0是T5557卡,1是MF1卡) * MF1_Area(整型) ---- MF1卡片分区号(取值范围2-15) * 返回值说明 : 通用字符串型(PChar) * (1)未成功读取时 * -1 ---- 串口打开失败 * -2 ---- 卡片无效 * 0 ---- 读数据失败 * 1 ---- 分区设置成功但不能正常读取数据(只在MF1卡时出现,可能由于该分区未初始化) * (2)成功读取时 * 卡号,卡类型 ---- 读取非宾客卡时的返回值,以英文逗号分隔 * 卡号,卡类型,楼栋号,楼层号,房间号,套间号,开始时间,结束时间,开特权门标记 ---- 读取宾客卡时的返回值,以英文逗号分隔 * 卡类型说明: * 0 ---- 空卡 , 1 ---- 新宾客卡 , 2 ---- 复制宾客卡 , 3 ---- 后备宾客卡 , * 4 ---- 宾客终止卡 , 5 ---- 反宾客终止卡 , 6 ---- 挂失卡 , 7 ---- 取消挂失卡 , * 8 ---- 楼栋卡 , 9 ---- 楼层卡 , 10 ---- 授权卡 , 11 ---- 锁体设置卡 , * 12 ---- 特权设置卡 , 13 ---- 房间设置卡 , 14 ---- 总卡 , 15 ---- 应急卡 , * 16 ---- 时钟卡 , 17 ---- 锁体信息卡 , 18 ---- 房间清除卡 , 19 ---- 初始化数量卡 , * 20 ---- 开锁数据卡 * 开特权门标记说明: * 1 ---- 有特权 , 0 ---- 无特权 ************************ Delphi 调用 ************************* * function ReadCardInfo(CommID : Integer; CardType : Integer; MF1_Area : Byte ) : PChar; external 'MF1_AnLock2009.dll'; stdcall; ************************************************************** * ************************* VB 调用 **************************** * Private Declare Function ReadCardInfo Lib "MF1_AnLock2009.dll" _ * (ByVal CommID As Long, ByVal CardType As Long, Optional ByVal MF1_Area As Long ) As String * ************************************************************** * ************************* PB 调用 **************************** * Function String ReadCardInfo( long CommID , long CardType , long MF1_Area ) Library "MF1_AnLock2009.dll"; ************************************************************** 例1: 假设端口号为3,当卡片为T5557卡时以ReadCardInfo(3,0,15)调用 当卡片为MF1卡,分区号为2时以ReadCardInfo(3,1,2)调用 例2: 当串口打开失败时,函数返回值: -1 例3: 当读取卡号为234D833A78的总卡时,函数返回值: 234D833A78,14 例4: 当读取卡号为234D833A78、楼栋号为2、楼层号为10、房间号为10101、套间号为3、开始时间为2007-10-10 12:20:23、 结束时间为2007-10-11 12:00:08的可开特权门的新宾客卡时, 函数返回值:234D833A78,1,2,10,10101,3,2007-10-10 12:20:00,2007-10-11 12:00:00,1 ************************************************************** ************************************************************** * 函数功能 : 写宾客卡信息 * 参数说明 : * CommID(整型) ---- 端口编号 * CardType(整型) ---- 卡片类型(0是T5557卡,1是MF1卡) * OldKeyEnd(整型) ---- 制新宾客卡设置1,BAKKey参数设置0;制复制宾客卡设置0,BAKKey参数设置0; * BAKKey(整型) ---- 制后备宾客卡设置1,OldKeyEnd参数设置为0 * TSRight(整型) ---- 可开特权门设置1,不允许开特权门设置0 * FloorCode(长整型) ---- 楼栋号(1-255) * FloorLayCode(长整型) ---- 楼层号(1-255) * RoomCode(长整型) ---- 房间号(1-65535) * iSubRoomCode(长整型) ---- 套间号(1-255),当没有套间房时请设置为255 * StartDateTime(通用字符串型) ---- 宾客卡起始时间(起始日期时间),20字符长度,格式'yyyy-mm-dd hh:nn:ss' * EndDateTime(通用字符串型) ---- 宾客卡有效时间(截止日期时间),20字符长度,格式'yyyy-mm-dd hh:nn:ss' * MF1_Area(整型) ---- MF1卡片分区号(取值范围2-15) * 返回值说明 : 整型(Integer) * -1 ---- 串口打开失败 * -2 ---- 无效卡片 * -3 ---- 软件未注册 * 0 ---- 写卡失败 * 1 ---- 成功 ********************** Delphi 调用 *************************** * function WriteGuestCard( CommID : Integer; CardType : Integer; * OldKeyEnd, BAKKey, TSRight :Integer; * FloorCode, FloorLayCode, RoomCode, iSubRoomCode :Cardinal; * StartDateTime :PChar; EndDateTime :PChar; MF1_Area :Byte ) :Integer; * external 'MF1_AnLock2009.dll'; stdcall; ************************************************************** * ************************* VB 调用 **************************** * Private Declare Function WriteGuestCard Lib "MF1_AnLock2009.dll" _ * (ByVal CommID As Long, ByVal CardType As Long, _ * ByVal OldKeyEnd As Long, ByVal BAKKey As Long, ByVal TSRight As Long, _ * ByVal FloorCode As Long, ByVal FloorLayCode As Long, ByVal RoomCode As Long, ByVal iSubRoomCode As Long, _ * ByVal StartDateTime As String, ByVal EndDateTime As String, Optional ByVal MF1_Area As Long ) As Long ************************************************************** * ************************* PB 调用 **************************** * Function long WriteGuestCard( long CommID, long CardType, * long OldKeyEnd, long BAKKey, long TSRight, * ulong FloorCode, ulong FloorLayCode, ulong RoomCode, ulong iSubRoomCode, * REF string StartDateTime, REF string EndDateTime, long MF1_Area) Library "MF1_AnLock2009.dll"; ************************************************************** 以下例子都以端口编号设置3、楼栋号设置2、楼层号设置10、房间号设置10101、套间号设置3、起始时间设置2007-10-10 12:00:00、有效时间设置2007-10-11 12:00:00为例 在MF1卡的调用假设分区号为2 例1: 写可开特权门的新宾客卡 T5557调用方式: WriteGuestCard(3,0,1,0,1,2,10,10101,3,2007-10-10 12:00:00,2007-10-11 12:00:00,15) MF1调用方式 : WriteGuestCard(3,1,1,0,1,2,10,10101,3,2007-10-10 12:00:00,2007-10-11 12:00:00,2) 例2: 写不可开特权门的复制宾客卡 T5557调用方式: WriteGuestCard(3,0,0,0,0,2,10,10101,3,2007-10-10 12:00:00,2007-10-11 12:00:00,15) MF1调用方式 : WriteGuestCard(3,1,0,0,0,2,10,10101,3,2007-10-10 12:00:00,2007-10-11 12:00:00,2) 例3: 写可开特权门的后备宾客卡 T5557调用方式: WriteGuestCard(3,0,0,1,1,2,10,10101,3,2007-10-10 12:00:00,2007-10-11 12:00:00,15) MF1调用方式 : WriteGuestCard(3,1,0,1,1,2,10,10101,3,2007-10-10 12:00:00,2007-10-11 12:00:00,2) ************************************************************** * 函数功能 : 回收卡片 * 参数说明 : CommID(整型) ---- 端口编号 * CardType(整型) ---- 卡片类型(0是T5557卡,1是MF1卡) * MF1_Area(整型) ---- MF1卡片分区号(取值范围2-15) * 返回值说明 : 整型(Integer) * -1 ---- 串口打开失败 * 0 ---- 写卡失败 * 1 ---- 成功 ********************** Delphi 调用 *************************** * function ClearCardInfo ( CommID : Integer; CardType : Integer; MF1_Area :Byte ) : Integer; * external 'MF1_AnLock2009.dll'; stdcall; ************************************************************** * ************************* VB 调用 **************************** * Private Declare Function ClearCardInfo Lib "MF1_AnLock2009.dll" _ * (ByVal CommID As Long, ByVal CardType As Long, Optional ByVal MF1_Area As Long ) As Long ************************************************************** * ************************* PB 调用 **************************** * Function long ClearCardInfo ( long CommID, long CardType, long MF1_Area) Library "MF1_AnLock2009.dll"; ************************************************************** 例1: 假设端口号为3,当卡片为T5557卡时以ClearCardInfo(3,0,15)调用 当卡片为MF1卡,分区号为2时以ClearCardInfo(3,1,2)调用

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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