var
MIA_USBKEY_BASE:String;function setUsbRan(const P: WideString): Integer;
begin
//这里对 MIA_USBKEY_BASE 赋值
end;
function getUsbKeyBase(const P: WideString):String;
begin
setUsbRan(p);
ShowMessage('MIA_USBKEY_BASE:'+MIA_USBKEY_BASE); //这里弹出消息正常
Result:=MIA_USBKEY_BASE;
end;procedure TForm1.BtnOnClick(Sender: TObject);
var
s:String;
begin
s:=getUsbKeyBase('123');
ShowMessage(s);//这里显示为空
end;为什么调用之后,字符串不能正确返回?
MIA_USBKEY_BASE:String;function setUsbRan(const P: WideString): Integer;
begin
//这里对 MIA_USBKEY_BASE 赋值
end;
function getUsbKeyBase(const P: WideString):String;
begin
setUsbRan(p);
ShowMessage('MIA_USBKEY_BASE:'+MIA_USBKEY_BASE); //这里弹出消息正常
Result:=MIA_USBKEY_BASE;
end;procedure TForm1.BtnOnClick(Sender: TObject);
var
s:String;
begin
s:=getUsbKeyBase('123');
ShowMessage(s);//这里显示为空
end;为什么调用之后,字符串不能正确返回?
估计是WideString->String赋值或者操作时,导致引用记数出了问题,贴出赋值那里的代码
function setUsbRan(const P: WideString): Integer;
var
usbHandel:THandle;
keyId: Array[0..64] of byte;
i:Integer;
R1,R2:WideString;
begin
MIA_RAN := StrToInt(P);
usbHandel:= Enum_Devices();//初始化加密狗 if(usbHandel=0)then
begin
Result:=0;
Exit;
end ; for i := 0 to 7 do
begin
keyId[i] :=0;
end; GetUKEY_ID(usbHandel,keyId);//加密够序列
R1:= intToStr(keyId[0]) + '-' + intToStr(keyId[1]) + '-' + intToStr(keyId[2]) + '-' + intToStr(keyId[3]) + '-' + intToStr(keyId[4]) + '-' + intToStr(keyId[5]) + '-' + intToStr(keyId[6]) + '-' + intToStr(keyId[7]); for i := 0 to 7 do
begin
if (keyId[i]=0) or (MIA_RAN mod (100-i) =0) then
R2:= R2 + '0'
else
R2:= R2 + intToStr(trunc(keyId[i] * 100.98) mod (MIA_RAN mod (100-i)));
end; MIA_USBKEY_BASE:=R1; //原始序列
MIA_USERKEY:=R2;//动态序列
Result:=1;
end;
function getUsbKeyBase(const P: WideString):String;
begin
setUsbRan(p);
Result:=MIA_USBKEY_BASE;
ShowMessage('MIA_USBKEY_BASE:'+Result);
end;
这样能弹出正确的值,但对话框关闭会报内存错误,估计是函数不能正确返回
如下代码正常:
function getUsbKeyBase(const P: WideString):String;
begin
setUsbRan(p);
Result:='';
Edit1.Text := MIA_USBKEY_BASE; //这里显示正确
end;function getValue:String{
Result:=Edit1.Text; //这里正确返回
}
1.检查一下GetUKEY_ID定义(stdcall/cdecl/register/safecall)是否和开发商提供的一致
2.检查一下SDK中Enum_Devices函数是否有参数
3.把这几个函数里的WideString全部改成String试一下,因为我没发现必须用WideString.
HANDLE Enum_Devices(void)
BOOL GetUKEY_ID(HANDLE hUKEY, U8 id[])本次程序测试:
function Enum_Devices():THandle;stdcall;External 'USBKEYLIB.dll';
function GetUKEY_ID(hUKEY :THandle;id:array of byte):BOOL;stdcall;External 'USBKEYLIB.dll';WideString全部改成String了,还是一样的结果
function GetUKEY_ID(hUKEY :THandle;id: Pointer):BOOL;stdcall;External 'USBKEYLIB.dll';调用改成
GetUKEY_ID(usbHandel,@keyId);//加密够序列
function Enum_Devices():THandle;cdecl;External 'USBKEYLIB.dll';
function GetUKEY_ID(hUKEY :THandle;id:array of byte):BOOL;cdecl;External 'USBKEYLIB.dll';问题解决
GetUKEY_ID(usbHandel,keyId);//加密够序列
MIA_USBKEY_BASE:=R1; //原始序列这两句加断点,看看keyId和MIA_USBKEY_BASE走完这两处时分别有变化没