【发布时间】:2015-01-19 19:47:24
【问题描述】:
我正在尝试挂钩来自 Wininet 的异步回调,该回调是从 TWebbrowser 调用的。但是,挂钩完成后会出现错误。为什么会这样?
$0018B7A2 第一次机会例外。异常类 $C000008C 带有消息“数组边界超出 0x0018b7a2”。处理 Project3.exe (3292)
THttpMonitor = class
private
FInternetStatusCallback: procedure(hInternet: HINTERNET; dwContext: DWORD_PTR; dwInternetStatus: DWORD; lpvStatusInformation: LPVOID; dwStatusInformationLength: DWORD);
FInternetSetStatusCallback: function(hInet: HINTERNET; lpfnInternetCallback: PFNInternetStatusCallback): PFNInternetStatusCallback; stdcall;
public
class function InternetSetStatusCallback(hInet: HINTERNET; lpfnInternetCallback: PFNInternetStatusCallback): PFNInternetStatusCallback; stdcall; static;
class procedure InternetStatusCallback(hInternet: HINTERNET; dwContext: DWORD_PTR; dwInternetStatus: DWORD; lpvStatusInformation: LPVOID; dwStatusInformationLength: DWORD); stdcall; static;
constructor Create;
destructor Destroy; override;
end;
class procedure THttpMonitor.InternetStatusCallback(hInternet: HINTERNET; dwContext: DWORD_PTR; dwInternetStatus: DWORD; lpvStatusInformation: LPVOID; dwStatusInformationLength: DWORD);
begin
HttpMonitor.FInternetStatusCallback(hInternet, dwContext, dwInternetStatus, lpvStatusInformation, dwStatusInformationLength);
end;
class function THttpMonitor.InternetSetStatusCallback(hInet: HINTERNET; lpfnInternetCallback: PFNInternetStatusCallback): PFNInternetStatusCallback; stdcall;
begin
HttpMonitor.FInternetStatusCallback := @lpfnInternetCallback;
Result := HttpMonitor.FInternetSetStatusCallback(hInet, @HttpMonitor.InternetStatusCallback); // ERROR!
end;
constructor THttpMonitor.Create;
begin
FInternetSetStatusCallback := InterceptCreate('wininet.dll', 'InternetSetStatusCallback', @InternetSetStatusCallback);
end;
destructor THttpMonitor.Destroy;
begin
InterceptRemove(FInternetSetStatusCallback);
inherited;
end;
....
procedure TForm1.Button1Click(Sender: TObject);
begin
Webrowser1.Navigate('www.stackoverflow.com');
end;
【问题讨论】:
标签: delphi wininet delphi-xe7