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;为什么调用之后,字符串不能正确返回?

解决方案 »

  1.   

    光从这些代码看不出问题.
    估计是WideString->String赋值或者操作时,导致引用记数出了问题,贴出赋值那里的代码
      

  2.   


    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;
      

  3.   

    代码没看出什么问题,晕了...这样测试一下
    function getUsbKeyBase(const P: WideString):String;
     begin
       setUsbRan(p);
       Result:=MIA_USBKEY_BASE;
       ShowMessage('MIA_USBKEY_BASE:'+Result); 
     end;
     
      

  4.   


    这样能弹出正确的值,但对话框关闭会报内存错误,估计是函数不能正确返回
    如下代码正常:
    function getUsbKeyBase(const P: WideString):String;
     begin
       setUsbRan(p);
       Result:='';
       Edit1.Text := MIA_USBKEY_BASE; //这里显示正确
     end;function getValue:String{
       Result:=Edit1.Text;  //这里正确返回
    }
      

  5.   

    函数返回时出错,通常是栈问题.
    1.检查一下GetUKEY_ID定义(stdcall/cdecl/register/safecall)是否和开发商提供的一致
    2.检查一下SDK中Enum_Devices函数是否有参数
    3.把这几个函数里的WideString全部改成String试一下,因为我没发现必须用WideString.
      

  6.   

    提供商定义:
    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了,还是一样的结果
      

  7.   

    定义改成
    function  GetUKEY_ID(hUKEY :THandle;id: Pointer):BOOL;stdcall;External 'USBKEYLIB.dll';调用改成
    GetUKEY_ID(usbHandel,@keyId);//加密够序列
      

  8.   

    感谢 @kiboisme是函数定义问题:
    function  Enum_Devices():THandle;cdecl;External 'USBKEYLIB.dll';
    function  GetUKEY_ID(hUKEY :THandle;id:array of byte):BOOL;cdecl;External 'USBKEYLIB.dll';问题解决
      

  9.   


    GetUKEY_ID(usbHandel,keyId);//加密够序列
    MIA_USBKEY_BASE:=R1; //原始序列这两句加断点,看看keyId和MIA_USBKEY_BASE走完这两处时分别有变化没