DElphi 调dll 报地址错误 求大虾帮~

freechy2008 2011-08-21 05:35:56
在delphi中调用dll后 显示成功,但运行到该函数的结尾end时 报错。
...全文
223 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
freechy2008 2011-08-22
  • 打赏
  • 举报
回复
这段代码执行是可以正确执行的。但只要改动就会报错。即使你的改动完全没有意义。比如在此函数加一个参数。但我不用它执行ir:=IC_WritePurchase_D0_PS01就一定报错 执行 ir:=IC_Purchase_D0_Ex却不会。
但ir:=IC_WritePurchase_D0_PS01执行是成功的 需运行到end.的时候才报错
Access violation at address 0x000000 in module 'star.exe '. Read
rainychan2009 2011-08-22
  • 打赏
  • 举报
回复
LZ,请不要相信诡异一说,至少在计算机中。你这个想法只会让你正面定位、解决问题越来越远。当遇到一个问题无从下手,可以采取砍掉一步代码,精简,然后测试的办法。
freechy2008 2011-08-22
  • 打赏
  • 举报
回复
当然我改变的那个函数在此函数前被调用了。这个unit 全部都存放的调用该dll的函数。问题是我只是做一个完全不影响现在执行环境的改动。就如加一个参数,却不用它。而且我是改变另外一个函数哦。而且一旦出错。我改回去。让代码完全和以前一样。还出错。 只能说太诡异。。。。。。。
freechy2008 2011-08-22
  • 打赏
  • 举报
回复
问题在于它本身是可以的。现在这个函数所在的unit 我改变了另外一个函数一样执行到这里也出错啊。
郁闷得想死。。。。
freechy2008 2011-08-22
  • 打赏
  • 举报
回复
代码太多 我吧调用方式发出来
function IC_WritePurchase_D0_PS01(iport: Longint; iDataFormat:integer; pszID:PCHAR; dkWh:double; iTimes:integer; pszDateTime:PCHAR; iParamFlag:integer; dPrewarnningkWh:double; dWarnningkWh:double; dCornerkWh:double; dDayFee:double; dMaxOverDraftkWh:double; dMaxTickkWh:double; dMaxCurrent:double; dSpecialMaxCurrent:double;iMaxTripTimes:integer; pszPassword:PCHAR; iCalcuMode:integer; var isw:integer): Longint;
stdcall; external 'starcpu2.dll';
funxu 2011-08-22
  • 打赏
  • 举报
回复
LZ不要被报错的位置迷惑了,感觉问题应该出现在内存的使用上,使用了不该使用的内存等,这些问题在dll释放时暴露出来,所以才会在end时弹出错误,还是把主要代码贴出来看看吧
一剑飘雪 2011-08-22
  • 打赏
  • 举报
回复
贴主要代码
lhs203203 2011-08-22
  • 打赏
  • 举报
回复
请问下你调用dll的调用方式是什么你都没有写 当然在释放的时候就会报指针错误了 加上stdcall或是cdecl就可以了
rainychan2009 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 freechy2008 的回复:]

这段代码执行是可以正确执行的。但只要改动就会报错。即使你的改动完全没有意义。比如在此函数加一个参数。但我不用它执行ir:=IC_WritePurchase_D0_PS01就一定报错 执行 ir:=IC_Purchase_D0_Ex却不会。
但ir:=IC_WritePurchase_D0_PS01执行是成功的 需运行到end.的时候才报错
Access violation at ……
[/Quote]
访问0地址,肯定是尝试访问一个没有分配内存的指针
rainychan2009 2011-08-21
  • 打赏
  • 举报
回复
什么样的错呢?很怀疑是string类型的形参造成的。加ShareMM
freechy2008 2011-08-21
  • 打赏
  • 举报
回复
附该函数源码:
function gf_WritePurchase_Ex(iMode:integer;
iDataFormat:integer;
szID:string;
dkWh:double;
iTimes:integer;
szDatetime:string;
iParamFlag:integer;
dPrewarningkWh:double;
dWarningkWh:double;
dCornerkWh:double;
dMinUsekWh:double;
dMaxOverDraftkWh:double;
dMaxTickkWh:double;
dMaxLoadkW:double;
iMaxTripTimes:integer;
iPTCT:integer;
szPassword:string;
dTickLoadThreshold:double;
isw:integer;szmetermodel:string):integer;
var
ir:integer;
begin
try
if (iMode=$D0) or (iMode=$B0) then begin
if szmetermodel ='S' then
ir:=IC_Purchase_D0_Ex(giPort,iDataFormat, PChar(szID), dkWh, iTimes , PChar(szDatetime),
iParamFlag, dPrewarningkWh, dWarningkWh, dCornerkWh, dMinUsekWh,
dMaxOverDraftkWh, dMaxTickkWh, dMaxLoadkW, iMaxTripTimes, iPTCT,PChar(szPassword), iMode, dTickLoadThreshold, isw)
else
ir:=IC_WritePurchase_D0_PS01(giPort,iDataFormat, PChar(szID), dkWh, iTimes , PChar(szDatetime),
iParamFlag, dPrewarningkWh, dWarningkWh, dCornerkWh, dMinUsekWh,
dMaxOverDraftkWh, dMaxTickkWh, dMaxLoadkW, dTickLoadThreshold,iMaxTripTimes, PChar(szPassword), iMode, isw);
end else
ir:=IC_Purchase_Ex(giPort,iDataFormat, PChar(szID), dkWh, iTimes , PChar(szDatetime),
iParamFlag, dPrewarningkWh, dWarningkWh, dCornerkWh, dMinUsekWh,
dMaxOverDraftkWh, dMaxTickkWh, dMaxLoadkW, iMaxTripTimes, iPTCT,PChar(szPassword), iMode, dTickLoadThreshold, isw);
except
ir:=-1;
end;
result:=ir;
end;

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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