如何检查调用的动态库错误!急 在程序里调用了一个DLL,DLL一出错误程序就自动关闭了.用try....except好像也不可以,请知道的朋友指导下,谢谢了. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DLL没有错误,可能是调用的问题 估计是调用规范(Call Convention)不“配套”的原因。多数Dll里的函数用的都是 stdcall,而Delphi默认的是register,这样必然导致进、出栈不对称。 调用方法,在dll程序的 run中打开,parameters 然后 在host application中,选择要调用此动态连接库德程序可执行文件。在程序中就可以直接用F4 F7 F8 察看当前的调试位置,的错误,也可能是在调用是参数不对,或申明不对,仔细检查 zhengji(看雨飞) 用的就是stdcall调用的.还有其它的方法吗? >>在程序里调用了一个DLLdll是不是你自己編的???如果是,不要引用主程序的 application.handle 一个新的问题,回答任何一个都可得分。在UNIT 名为:Upubic中定义了几个record大体情况如下:type DeliverStr = packed record ......... end;type MTRespStr = packed record .......end;type ReportStr = packed Record ......end;type MTErrStr = packed record .....end;还定义了一下出错信息提示....主程序UNIT 名为uses UPUBLIC;此程序调用DLLtype TDeliverStr =^DeliverStr;type TReportStr =^ReportStr;type TMTRespStr =^MTRespStr;type TMTErrStr =^MTErrStr;function Deliver(PackageType:PInteger;DeliverMessage:TDeliverStr;DeliverReport:TReportStr;DeliverResp:TMTRespStr;MTErrorStr:TMTErrStr):integer;stdcall;external '**.DLL' name 'Deliver';在TIMER事件中不断调用DeliverVARnRet : integer;n:PInteger;test1:TDeliverStr;test2:TReportStr;test3:TMTRespStr;test4:TMTErrStr;begin Timer1.Enabled:=false; getmem(n,sizeof(n)); getmem(test1,sizeof(DeliverStr)); getmem(test2,sizeof(ReportStr)); getmem(test3,sizeof(MTRespStr)); getmem(test3,sizeof(MTErrStr)); nRet:=Deliver(n,test1,test2,test3); FREEMEM(n,sizeof(n)); FREEMEM(test1,sizeof(DeliverStr)); FREEMEM(test2,sizeof(ReportStr)); FREEMEM(test3,sizeof(MTRespStr)); FREEMEM(test3,sizeof(MTErrStr));end;编译通过,但是调用Deliver提示信息为:Invailid Pointer operation.不知道参数定义哪里有问题请大家帮忙解决,这几天就要用的.谢谢大家了说下DELIEVER的函数情况:int Deliver(int *type,DeliverStr* DeliverStruct,ReportStr* ReportStruct,MTRespStr* RespStruct,MTErrorStr* MTErrorStruct) 楼主带着眼镜??这样的错误都没看出来?? getmem(n,sizeof(n)); getmem(test1,sizeof(DeliverStr)); getmem(test2,sizeof(ReportStr)); getmem(test3,sizeof(MTRespStr)); getmem(test3,sizeof(MTErrStr)); 《《《《----- 错了吧!!! nRet:=Deliver(n,test1,test2,test3);应该是:getmem(test4,sizeof(MTErrStr)); 调Deliver调得也不对,少了一个参数,你怎么可能编译通过?怪了。nRet:=Deliver(n,test1,test2,test3, test4); 哦,以上是我写错了的.程序上是对的 getmem(n,sizeof(n)); getmem(test1,sizeof(DeliverStr)); getmem(test2,sizeof(ReportStr)); getmem(test3,sizeof(MTRespStr)); getmem(test4,sizeof(MTErrStr)); nRet:=Deliver(n,test1,test2,test3,test4); 那个DLL不是你自己写的吗,可以在DLL里控制异常。 dll 不是自己写的,所以麻烦啊,请大家再次帮忙 折腾来折腾去,或许是那个 dll 本省就是错的吧,楼主看着办吧。有的错误,纵使 catch 住了,又有什么用? 难道是提示“对不起,程序编得不对”? 用Delphi开发一个类淘宝旺旺的客户端和服务器端程序,用UNIX/Linux服务器,安全性怎样? 求助:动态生成组件,总是报错 再问关于邮件附件的问题 在线等待,COMBOBOX的控件里的每一个ITEM前面加一个图标 正在学习 COM 请教一个概念问题 有什么比较不错的介绍delphi数据库编程的资料!!各位大虾介绍一下!! 关于edit的简单问题! 哪位高人写过IP地址控件或有IP地址控件的源码吗?? 怎样在Delphi中编写发手机短信的程序?(高分求救) ADO操作Excel超级难题?设置以文本读取还是读不出来? 6本delphi的书,160元包邮,UP有分! 问题
register,这样必然导致进、出栈不对称。
在host application中,选择要调用此动态连接库德程序可执行文件。
在程序中就可以直接用F4 F7 F8 察看当前的调试位置,的错误,也可能是在调用是参数不对,或申明不对,仔细检查
还有其它的方法吗?
dll是不是你自己編的???如果是,不要引用主程序的 application.handle
在UNIT 名为:Upubic中定义了
几个record大体情况如下:
type
DeliverStr = packed record
.........
end;
type
MTRespStr = packed record
.......
end;
type
ReportStr = packed Record
......
end;
type
MTErrStr = packed record
.....
end;
还定义了一下出错信息提示....主程序UNIT 名为
uses UPUBLIC;
此程序调用DLL
type TDeliverStr =^DeliverStr;
type TReportStr =^ReportStr;
type TMTRespStr =^MTRespStr;
type TMTErrStr =^MTErrStr;function Deliver
(PackageType:PInteger;DeliverMessage:TDeliverStr;DeliverReport:TReportStr;DeliverResp:TMTRespStr;MTErrorStr:TMTErrStr):integer;stdcall;external '**.DLL' name 'Deliver';在TIMER事件中不断调用Deliver
VAR
nRet : integer;
n:PInteger;
test1:TDeliverStr;
test2:TReportStr;
test3:TMTRespStr;
test4:TMTErrStr;
begin
Timer1.Enabled:=false;
getmem(n,sizeof(n));
getmem(test1,sizeof(DeliverStr));
getmem(test2,sizeof(ReportStr));
getmem(test3,sizeof(MTRespStr));
getmem(test3,sizeof(MTErrStr));
nRet:=Deliver(n,test1,test2,test3);
FREEMEM(n,sizeof(n));
FREEMEM(test1,sizeof(DeliverStr));
FREEMEM(test2,sizeof(ReportStr));
FREEMEM(test3,sizeof(MTRespStr));
FREEMEM(test3,sizeof(MTErrStr));
end;
编译通过,但是调用Deliver提示信息为:Invailid Pointer operation.不知道参数定义哪里有问题请大家帮忙解决,这几天就要用的.谢谢大家了
说下DELIEVER的函数情况:
int Deliver(int *type,DeliverStr* DeliverStruct,ReportStr* ReportStruct,MTRespStr* RespStruct,MTErrorStr* MTErrorStruct)
getmem(test1,sizeof(DeliverStr));
getmem(test2,sizeof(ReportStr));
getmem(test3,sizeof(MTRespStr));
getmem(test3,sizeof(MTErrStr)); 《《《《----- 错了吧!!!
nRet:=Deliver(n,test1,test2,test3);应该是:getmem(test4,sizeof(MTErrStr));
getmem(n,sizeof(n));
getmem(test1,sizeof(DeliverStr));
getmem(test2,sizeof(ReportStr));
getmem(test3,sizeof(MTRespStr));
getmem(test4,sizeof(MTErrStr));
nRet:=Deliver(n,test1,test2,test3,test4);