delphi access violation

liuyonghong159632 2012-02-08 11:32:19
主窗体 方法DeCodeMethod(IMSI:PChar; StartDate:PChar; LastDays:Integer):String;
其中调用C语言 dll中一个方法, 返回一个字符串 str

在子窗体中 调用主窗体方法DeCodeMethod 得到返回的str , 采用ShowMessage(Str) 正确没问题!
采用Self.Edit.Text:=Str; 就产生一个 access violation atox00452d25...错误 , 百思不得其解.....
求原因 求办法....
...全文
235 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyonghong159632 2012-02-10
  • 打赏
  • 举报
回复
20分实在难以表达我对你们的感谢,可不知道怎么加分! 就委屈委屈了 哈哈 !
谢谢亲们....
liuyonghong159632 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kaikai_kk 的回复:]
self去掉,或把self改成子窗体的name值,比如form2.Edit1.Text
若报错,表示form2未建立,或者建立了但在调用主窗体方法时(是否还有其它的代码),被关了
[/Quote] 亲呀 你咋不早现身呢 , 我把self 换成了窗体的名字 后就没问题了!
这实在太坑爹了......折腾了我两天!
比我老板那SB的办法好 让我先存到数据库 再从数据库 提取!(都快把我给吹死了)!
问题是解决了 可这是为什么呢! 咋用了 主窗体那个方法后 用self 就成这样了....
zhouxianqun 2012-02-10
  • 打赏
  • 举报
回复
严重同意kaikai_kk!
你直接给Self.Edit1.Text:=‘你有病呀’
看会不会出错。
如果出错的话可以肯定你把Self用错了。或者Edit1根本没创建
kaikai_kk 2012-02-10
  • 打赏
  • 举报
回复
self去掉,或把self改成子窗体的name值,比如form2.Edit1.Text
若报错,表示form2未建立,或者建立了但在调用主窗体方法时(是否还有其它的代码),被关了
liuyonghong159632 2012-02-10
  • 打赏
  • 举报
回复
我方法 返回的本来就是String ;
强制转换了一下 还是错误!

测了N久 发现:在子窗体 的某个事件中 只要调用了主窗体方法 ,获得了正常的返回值 tmpStr 之后,
接着对子窗体控件的操作就都失败了! 如:
tmpStr:=MsgCatFrm.DeCodeMethod(PChar('2222'),PChar('20120203'),360);
ShowMessage(tmpStr);//正确 "slfowenfia13k492923u4"
Self.Edit1.Text:='想不通';//依然 产生地址错误
Self.Edit1.Text:=tmpStr;//会产生地址错误

返回值 tmpStr 没问题 可以从新赋值 或存入数据库.....
再求答案.....
gitionyet 2012-02-09
  • 打赏
  • 举报
回复
我也试过……错误使用指针或无效地址,修复以后却显示@xx not find,坐等高手解答
CS_DNisSB2B 2012-02-09
  • 打赏
  • 举报
回复
强制类型转化一下 edit1.Text := string(tmpStr)
liuyonghong159632 2012-02-09
  • 打赏
  • 举报
回复
长度是多少就是多少 没问题 我数过[Quote=引用 8 楼 erhan 的回复:]
ShowMessage(tmpStr);//正确 "slfowenfia13k492923u4"
showmessage(inttostr(length(tmpstr))); 是多少?
[/Quote]
liuyonghong159632 2012-02-09
  • 打赏
  • 举报
回复
长度是多少就是多少 没问题 我数过[Quote=引用 7 楼 liuyonghong159632 的回复:]
子窗体 的一个按钮点击事件...
Var
tmpStr:String;
Begin
tmpStr:=MsgCatFrm.DeCodeMethod(PChar('2222'),PChar('20120203'),360);
ShowMessage(tmpStr);//正确 "slfowenfia13k492923u4"
Self.Edit1.Text:=tmpStr;//……
[/Quote]
kaikai_kk 2012-02-08
  • 打赏
  • 举报
回复
一般就是某个控件/窗体/变量...没创建就使用,或者是分配了内容未释放才报地址错误
要看具体代码怎么写的
erhan 2012-02-08
  • 打赏
  • 举报
回复
ShowMessage(tmpStr);//正确 "slfowenfia13k492923u4"
showmessage(inttostr(length(tmpstr))); 是多少?
liuyonghong159632 2012-02-08
  • 打赏
  • 举报
回复
子窗体 的一个按钮点击事件...
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;
liuyonghong159632 2012-02-08
  • 打赏
  • 举报
回复
就没有人回复么? 难道我问的问题太白痴了....
babydog01 2012-02-08
  • 打赏
  • 举报
回复
把出错上下的语句贴出来,看看。。。
liuyonghong159632 2012-02-08
  • 打赏
  • 举报
回复
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;
liuyonghong159632 2012-02-08
  • 打赏
  • 举报
回复
子窗体的控件都存在,并且其他地方都能正常使用此控件!

只要是类似于 把Str 赋值给窗体控件的 都会产生地址错误,有点儿像这个Str没有提前赋值一样...
而直接ShowMessage(Str) 缺是正常结果....
bdmh 2012-02-08
  • 打赏
  • 举报
回复
看看Self或者Edit是否存在

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧