这种情况维持了很长一段时间,问题依然无法定位解决,如果能够根据报错信息直接定位到具体的delphi的源代码行就好了,说干就干,经过一晚上的努力,终于找到了一个比较简单,当然是十分适合delphi的方法。
下面将这个方法介绍给大家,以delphi7为对象:
1、先对需要分析的程序源代码重新编译,编译的同时需要获得对应的MAP文件,下面是具体的 *** 作步骤:
2) 重新编译程序,在设定生成最终执行文件的目录下你可以发现一个与执行文件同名,后缀为map的文件,这个就是我们要的map文件了。
delete不需要加Post。删除前要判断表中是否有数据
if tb.RecordCount>0 then
tb.delete
如果数据集使用的dbexpress中的TSimpleDataSet,或者是TClientDataSet, 要提交时需要添加
tb.applyUpdates(-1)
1、Indy是个很垃圾的玩意,这个错误是Indy控件本身的问题,你自身无法解决,除非自己写API或调用OCX控件。2、你的函数本身也有问题,Dll里的字符串不能这样传递。你看看Windows的API函数就知道,没有一个是以PChar为返回值的(字符串函数除外)。你这个程序能正常运行,真是奇迹。
3、下面这个函数是我给你改的,sURL是地址;Buffer是一个缓冲区,用来接收IP地址;BufferLength是缓冲区长度,当Buffer为 nil 时它返回需要的空间大小;函数返回值为IP地址的长度。
function getIPAddress(sURL, Buffer: PCharvar BufferLength: Longint): Longintstdcall
var
ICMP: TIdIcmpClient
R: TReplyStatus
s: string
begin
Result := 0
ICMP := TIdIcmpClient.Create(nil)
ICMP.ReceiveTimeout := 1000
ICMP.Host := sURL
ICMP.Ping
R := ICMP.ReplyStatus
s := Format('%d,', [R.MsRoundTripTime]) + R.FromIpAddress
if Buffer = nil then
BufferLength := Length(s) + 1
else begin
StrLCopy(Buffer, PChar(s), BufferLength - 1)
Result := StrLen(Buffer)
end
ICMP.free
end
4、在主程序中,这个函数这样调用
var
len: Longint
buf: PChar
begin
getIPAddress(sURL, nil, len)
GetMem(buf, len)
getIPAddress(sURL, buf, len)
ShowMessage(buf)
FreeMem(buf)
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)