一个VC写的dll中的函数,声明如下:
WORD SLE4442_ReadPWD(
BYTE *_bPWD
);
参数
_bPWD
字符型指针,指向从卡片内读到的密码并返回给应用程序。在HEXADECIMAL模式下,应用程序应确保在调用此函数前,已分配给_bPWD指针至少3个字节的空间;在ASCIISTRING模式下,应确保已分配给_bPWD指针至少6个字节的空间。
WORD MCS_SetStringMode(
BYTE _bStringMode,
);
参数
_bStringMode
设置随后操作的字符串传递方式:
常量 值 含义
HEXADECIMAL 0 16进制字符串
ASCIISTRING 1 ASCII字符串
我的程序:
function MCS_SetStringMode(_StringMode: BYTE): WORD;
stdcall; external MCS_SR.DLL;
function SLE4442_ReadPWD( _bPWD:PChar): WORD;
stdcall; external MCS_SR.DLL;
procedure TForm1.Button5Click(Sender: TObject);
var
Pass:pchar;
S:string;
begin
Pass:=StrAlloc(4*sizeof(Char));
case MCS_SetStringMode(0) of
0: Showmessage(设置成功!);
else Showmessage(设置失败!);
end;
case SLE4442_ReadPWD(Pass) of
0: begin
Showmessage(密码读取成功!);
S:=Pass;
StrDispose(Pass);
Label1.Caption:=S;
end;
else Showmessage(密码读取失败!);
end;
end;
程序运行后函数都能返回0,说明调用成功,但读出来的密码是,请高手指教,万分感谢!
function SLE4442_ReadPWD( _bPWD:PChar): WORD
应该是function SLE4442_ReadPWD(var _bPWD:PChar): WORD
这样才能把_bPWD的值带出来
不对,PChar是指向Char的指针,利用指针传递参数是不需要加Var指示字,问题出在PChar的类型不可以直接赋值给String类型,而String类型通过强制类型转换却可以赋值给PChar类型。因此上述代码应改成下列方式:
procedure TForm1.Button5Click(Sender: TObject);
var
Pass:pchar;
S:string;
begin
Pass:=StrAlloc(4*sizeof(Char));
SetLength(S, 4);
case MCS_SetStringMode(0) of
0: Showmessage(设置成功!);
else Showmessage(设置失败!);
end;
case SLE4442_ReadPWD(Pass) of
0: begin
Showmessage(密码读取成功!);
Move(Pass^, S[1], 4);
StrDispose(Pass);
Label1.Caption:=S;
end;
else Showmessage(密码读取失败!);
end;
end;
关注
up
应该是function SLE4442_ReadPWD(var _bPWD:^Byte): WORD
type p=^byte;
function SLE4442_ReadPWD(var _bPWD:p): WORD
就没问题了
常量 值 含义
HEXADECIMAL 0 16进制字符串
ASCIISTRING 1 ASCII字符串
case MCS_SetStringMode(0) of
是不是这里的问题?
你没有写这个SLE4442_ReadPWD的定义
试试这两种
case SLE4442_ReadPWD(@Pass) of
0: begin
Showmessage(密码读取成功!);
S:=Pass;
StrDispose(Pass);
Label1.Caption:=S;
end;
else Showmessage(密码读取失败!);
end;
把指针地址传入
或者
case SLE4442_ReadPWD(Pass^) of
把指针所指向的内存地址传入
一个VC写的dll中的函数,声明如下:
WORD SLE4442_ReadPWD(
BYTE *_bPWD
);
参数
_bPWD
字符型指针,指向从卡片内读到的密码并返回给应用程序。在HEXADECIMAL模式下,应用程序应确保在调用此函数前,已分配给_bPWD指针至少3个字节的空间;在ASCIISTRING模式下,应确保已分配给_bPWD指针至少6个字节的空间。
WORD MCS_SetStringMode(
BYTE _bStringMode,
);
参数
_bStringMode
设置随后操作的字符串传递方式:
常量 值 含义
HEXADECIMAL 0 16进制字符串
ASCIISTRING 1 ASCII字符串
我的程序:
type pbyte=^byte
function MCS_SetStringMode(_StringMode: BYTE): WORD;
cedcl; external MCS_SR.DLL;
function SLE4442_ReadPWD( _bPWD:pbyte): WORD;
cedcl; external MCS_SR.DLL;
procedure TForm1.Button5Click(Sender: TObject);
var
Pass:pchar;
S:string;
begin
Pass:=StrAlloc(4*sizeof(Char));
case MCS_SetStringMode(0) of
0: Showmessage(设置成功!);
else Showmessage(设置失败!);
end;
case SLE4442_ReadPWD(Pass) of
0: begin
Showmessage(密码读取成功!);
S:=Pass;
StrDispose(Pass);
Label1.Caption:=S;
end;
else Showmessage(密码读取失败!);
end;
end;
关注
dll
不会,关注