【问题标题】:How to fix 'Access violation at address 00660938 in module Project1.exe. Read of address 00000150.' in Indy (Delphi 10.3 Rio)如何修复模块 Project1.exe 中地址 00660938 的访问冲突。读取地址 00000150。在印地 (Delphi 10.3 Rio)
【发布时间】:2019-06-01 07:27:29
【问题描述】:

我正在编写一个可以解密 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;

那么,我应该怎么做才能解决这个问题?

【问题讨论】:

  • @Zam 我在表单中添加了 Indy HTTP 组件;但它仍然会抛出“Bad Request”错误。
  • 附带说明,我不建议使用TStringStream 来接收响应,尤其是在未指定Encoding 时。 Post() 有一个重载,将响应作为 String 返回,请改用它,例如:ShowMessage(HTTP.Post('http://dcrypt.it/decrypt/upload', Params));

标签: delphi post indy


【解决方案1】:

您没有初始化 HTTP 组件。由于是全局变量,所以会自动初始化为nil

当您拨打HTTP.Post('http://dcrypt.it/decrypt/upload', Params, Stream); 时,它不会在呼叫地点立即中断。您在 nil 引用上调用它,因此它会在访问某些内部字段或尝试调用虚拟方法时立即导致 AV。

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

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

此外,最好的做法是避免使用全局变量。您可以并且应该将所有必要的变量声明为本地变量。并确保在完成后释放所有内容。

【讨论】:

  • 以及 1) 发布 TStringStream 2) 发布 TIdMultiPartFormDataStream
  • @Zam 我只是在输入 :)
猜你喜欢
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多