delphi编写的dll在Pb中使用时存在问题(100分)

  • 主题发起人 主题发起人 yanghai0437
  • 开始时间 开始时间
Y

yanghai0437

Unregistered / Unconfirmed
GUEST, unregistred user!
因为我在函数的参数中使用了Pchar类型,但是Pb调用时有时候正确有时候不正确,
不知道是为什么,而我用delphi写的测试程序调用就没有问题,请大家帮忙。
function IC_WriteFinger(buf:Pchar;sKey:PChar):Integer;
stdcall;
var
Str_char:array[0..256] of char;
my,mm,md:String;
ny,nm,nd:Byte;
i,nLen:Integer;
mStrdata,smKey:String;
mEnDatabuf:String;
st:smallint;
begin

if sKey=nil then
begin
Result:=IC_GetICMainKey_Err;
Exit;
end;
mStrdata :=sKey;
if Length(mStrdata)<1 then
begin
//密钥不正确
Result:=IC_GetICMainKey_Err;
Exit;
end;
//解密
smKey := DESryStr(sKey,StrDES_EncryptKey);
//得到数据
mStrdata := buf;
// StrCopy(PChar(mStrdata),buf);
//加密 数据
mEnDatabuf := EncryStr(mStrdata,smKey);
StrCopy(Str_char,PChar(mEnDatabuf));
nLen:=Length(mEnDatabuf);
st:=swr_xxxx(icdev,32,nLen,Str_char);
//写入数据
if st<>0 then
begin
Result := IC_Write_CARD_ERR;
exit;
end;


Result:=IC_WriteDoorFlag(IC_FLAG_USED);
end;

function IC_GetFinger(nIndex:byte;sKey:PChar;buf:PChar;bIsDp:boolean):Integer;stdcall;
var

Str_char:array[0..200] of char;
mStrdata,menbuf:String;
smKey:String;
_Addr:Integer;
st:smallint;
const
_Length = 200;
begin
if (nIndex<1)or(nIndex>3) then
nIndex:=1;
_Addr :=500;

st:=srd_XXxX(icdev,_Addr,_Length,Str_char);
//读取指定位置的数据
if st <> 0 then
begin
Result := IC_READ_CARD_ERR;
Exit;
end;
mStrdata:='';
mStrdata:=Copy(Str_char,0,_Length);
if bIsDp then
smKey := StrDES_EncryptKey
else
//解密主密钥
smKey := DESryStr(sKey,StrDES_EncryptKey);
//解密数据
menbuf := DESryStr(mStrdata,smKey);
// StrCopy(buf,PChar(menbuf));//这样写就会有时候正确有时候不正确
for i:=1 to length(menbuf)do
buf[i-1] :=membuf;
//这样写就没有出错,但是Pb调用后,pb就会偶尔报错,

Result := IC_SUCCESS;
end;
 
PB中没有指针类型的,你必须改过
 
我如果用String 类型Pb根本就不能把字符串传进来
我也不能传给PB
 
你PB里面怎么写的啊?
如果需要回传参数,则需要预先分配空间的
 
我是这样用
string buf
函数声明中加上了ref
buf=space(200)
然后才使用的
 
可能我的数据中包含了#0字符,导致传出或者传入的数据不正确,如果我采集的数据中确实
存在#0字符,该怎样传??
在pb中就是用没有#0的字符好像也传不成功
 
把加密结果转换成字符,例如#0就是'00',解密时在转回来,PChar碰到#0会被截断
 
用字符数组做参数,或者其他数据类型
 
写成COM,用BSTR传。
 
没有时间改成com了,在Pb中可以用数组作为函数的传入和传出的参数吗
 
多人接受答案了。
 
后退
顶部