我正在写一个可以解密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;
那么,我该怎么办才能解决此问题?
答案 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;
此外,优良作法是应避免使用全局变量。您可以并且应该将所有必要的变量声明为局部变量。并确保完成后释放所有内容。