发现Delphi 6.0(sp1)中的一个bug (50分)

  • 主题发起人 主题发起人 ZHC
  • 开始时间 开始时间
Z

ZHC

Unregistered / Unconfirmed
GUEST, unregistred user!
发现Delphi 6.0中的一个bug

版本delphi6.0(sp1)
操作系统:windows2000中文专业版(sp2)
我用的一个控件在运行时程序总是出错,经过跟踪发现该控件在调用wininet中的函数

ReadUrlCacheEntryStream总是不能正常运行,我百思不得其解,耗费了我3个小时才发现问题。
查看msdn,该函数的C++语言定义为:
BOOL ReadUrlCacheEntryStream(
; ; HANDLE hUrlCacheStream,
; ; DWORD dwLocation,
; ; LPVOID lpBuffer,
; ; LPDWORD lpdwLen,
; ; DWORD dwReserved
);

而此函数在delphi6中wininet.pas文件中的定义为:
function ReadUrlCacheEntryStream(hUrlCacheStream: THandle;
; dwLocation: DWORD; var lpBuffer: Pointer;
; var lpdwLen: DWORD; Reserved: DWORD): BOOL; stdcall;
; {$EXTERNALSYM ReadUrlCacheEntryStream}

大家注意第三个参数定义var lpBuffer: Pointer,这里多了一个var,如果使用传址方式传递指针lpBuffer,实

际传给函数的是指针的指针,也就是指向lpBuffer的指针,而不是lpBuffer指针本身,程序自然无法运行.
我把var去掉,正确定义如下:
function ReadUrlCacheEntryStream(hUrlCacheStream: THandle;
; dwLocation: DWORD; lpBuffer: Pointer;
; var lpdwLen: DWORD; Reserved: DWORD): BOOL; stdcall;
; {$EXTERNALSYM ReadUrlCacheEntryStream}

重新编译wininet.pas文件,程序能够可以正常运行了。

不知我以上的解释是否正确,请大家赐教,唉!delphi6已经出了一个补丁包了,
结果还是这么多错误,我今天刚一编程就遇到了问题,不知以后还会遇到什么稀奇古怪的事情。
 
加后出来的pack
 
分析得不错! 幸好我一直还没用过Delphi6.0!
 
to:jqw
我已经加了service pack1,不知道你所指的后出来的pack指的是什么?
 
第一个pack,据说有问题
不知你加的是否是后出来的pack
 
多人接受答案了。
 
后退
顶部