主窗体 方法DeCodeMethod(IMSI:PChar; StartDate:PChar; LastDays:Integer):String;
       其中调用C语言 dll中一个方法, 返回一个字符串 str在子窗体中 调用主窗体方法DeCodeMethod 得到返回的str , 采用ShowMessage(Str) 正确没问题!
采用Self.Edit.Text:=Str; 就产生一个 access violation atox00452d25...错误 , 百思不得其解.....
求原因 求办法....

解决方案 »

  1.   

    子窗体的控件都存在,并且其他地方都能正常使用此控件!只要是类似于 把Str 赋值给窗体控件的 都会产生地址错误,有点儿像这个Str没有提前赋值一样...
    而直接ShowMessage(Str) 缺是正常结果....
      

  2.   

    Function  TMsgCatFrm.DeCodeMethod(IMSI:PChar; StartDate:PChar; LastDays:Integer):String;
    Type
      TDeCodeMethod=Function( const imsi:PChar; Const start_date:PChar; days:Integer; out_str: PChar):Integer;stdcall;
    Var
      tmpInt:Integer;
      tmpStr:String;
      DeCodePChar:PChar;
      DeCodeMethod:TDeCodeMethod;
      DeCodeHandle:Thandle;  
    Begin    tmpInt:=-1;
        tmpStr:='';
        GetMem(DeCodePChar,65);                                                     //动态申请内存空间 65字符    Try
          DeCodeHandle:=LoadLibrary('BdEncrypterLib.dll');                          //加载外部解码动态链接库
          @DecodeMethod:=GetProcAddress(DeCodeHandle,'EncryptData');                //绑定动态链接库中的方法
          if(Assigned(@DecodeMethod)) then begin                                    //如果关联成功
            tmpInt:=DeCodeMethod(IMSI, StartDate, LastDays, DeCodePChar);           //调用方法
            tmpStr:=DeCodePChar;
          end;
        Finally
          FreeLibrary(DeCodeHandle);                                                //释放当前句柄
          FreeMem(DeCodePChar);                                                     //释放内存空间
        End;                                                                  if(tmpInt<>-1) then begin
          //解码入库  记录**********************************************************
        end else begin
          ShowMessage('青蛙友情提示:'+#13+#10+'解码错误,请确认手机IMSI 起始日期 持续时间!');
        end;
        Result:=tmpStr;
      
    End;
      

  3.   

    子窗体 的一个按钮点击事件...
    Var
      tmpStr:String;
    Begin
      tmpStr:=MsgCatFrm.DeCodeMethod(PChar('2222'),PChar('20120203'),360);
      ShowMessage(tmpStr);//正确 "slfowenfia13k492923u4"
      Self.Edit1.Text:=tmpStr;//错误 
      Self.Memo1.Text:=tmpStr;//错误
      Self.Memo1.Lines.add(tmpStr);//错误 
    End;
      

  4.   

      ShowMessage(tmpStr);//正确 "slfowenfia13k492923u4"
      showmessage(inttostr(length(tmpstr))); 是多少?
      

  5.   

    我也试过……错误使用指针或无效地址,修复以后却显示@xx not find,坐等高手解答
      

  6.   

    强制类型转化一下 edit1.Text := string(tmpStr)
      

  7.   

    我方法 返回的本来就是String  ; 
    强制转换了一下 还是错误!测了N久  发现:在子窗体 的某个事件中 只要调用了主窗体方法 ,获得了正常的返回值 tmpStr 之后,
    接着对子窗体控件的操作就都失败了! 如:
    tmpStr:=MsgCatFrm.DeCodeMethod(PChar('2222'),PChar('20120203'),360);
    ShowMessage(tmpStr);//正确 "slfowenfia13k492923u4"
    Self.Edit1.Text:='想不通';//依然 产生地址错误
    Self.Edit1.Text:=tmpStr;//会产生地址错误返回值 tmpStr 没问题 可以从新赋值 或存入数据库.....
    再求答案.....
      

  8.   

    self去掉,或把self改成子窗体的name值,比如form2.Edit1.Text
    若报错,表示form2未建立,或者建立了但在调用主窗体方法时(是否还有其它的代码),被关了
      

  9.   

    严重同意kaikai_kk!
    你直接给Self.Edit1.Text:=‘你有病呀’
    看会不会出错。
    如果出错的话可以肯定你把Self用错了。或者Edit1根本没创建
      

  10.   

     亲呀 你咋不早现身呢  , 我把self 换成了窗体的名字 后就没问题了! 
    这实在太坑爹了......折腾了我两天!
    比我老板那SB的办法好 让我先存到数据库 再从数据库 提取!(都快把我给吹死了)!
    问题是解决了  可这是为什么呢! 咋用了 主窗体那个方法后 用self 就成这样了....