如何在模块Project1.exe中修复'访问冲突,地址为00660938。读取地址00000150。”在印第(Delphi 10.3 Rio)

时间:2019-01-06 10:40:04

标签: delphi post indy

我正在写一个可以解密JDownloader DLC文件的软件。该程序将通过POST请求将dlc文件发送到“ http://dcrypt.it/decrypt/upload”,并将获得解码后的链接作为响应。

这是引发该错误的代码:

var
  Form1: TForm1;
    Stream: TStringStream;
    Params: TIdMultiPartFormDataStream;
    HTTP: TIdHTTP;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  Stream := TStringStream.Create('');
  Params := TIdMultiPartFormDataStream.Create;
  Params.AddFile('File1', 'D:\3fcaa401f8f3ebe32fb93cb607ecadd01ee954ed.dlc', 'application/octet-stream');
  HTTP.Post('http://dcrypt.it/decrypt/upload', Params, Stream);
  ShowMessage(Stream.DataString);
end;

调试程序时,Delphi IDE在IdHTTP.pas中显示这些内容:

function TIdCustomHTTP.GetRequest: TIdHTTPRequest;
begin
 Result := FHTTPProto.Request; //This line is highlighted.
end;

那么,我该怎么办才能解决此问题?

1 个答案:

答案 0 :(得分:6)

您没有初始化HTTP组件。由于它是一个全局变量,它将被自动初始化为nil

当您致电HTTP.Post('http://dcrypt.it/decrypt/upload', Params, Stream);时,它不会在通话处立即中断。您是在nil引用上调用它的,因此一旦它访问某个内部字段或尝试调用虚拟方法,它就会导致AV。

在使用HTTP组件之前,必须先构造它:

HTTP := TIdHTTP.Create(nil);
try
  ...
finally
  HTTP.Free;
end;

此外,优良作法是应避免使用全局变量。您可以并且应该将所有必要的变量声明为局部变量。并确保完成后释放所有内容。