Как исправить 'нарушение прав доступа по адресу 00660938 в модуле Project1.exe. Прочитать адрес 00000150. в Инди (Дельфи 10,3 Рио) - PullRequest
0 голосов
/ 06 января 2019

Я пишу программное обеспечение, которое расшифровывает файлы JDownloader DLC. Эта программа отправит файл dlc на "http://dcrypt.it/decrypt/upload" с запросом POST и получит расшифрованные ссылки в ответ.

Это мой код, который выдает эту ошибку:

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 голосов
/ 06 января 2019

Вы не инициализируете компонент HTTP. Поскольку это глобальная переменная, она будет автоматически инициализирована как nil.

Когда вы звоните HTTP.Post('http://dcrypt.it/decrypt/upload', Params, Stream);, он не сломается сразу по месту вызова. Вы вызываете его по ссылке nil, поэтому он вызывает AV, как только получает доступ к некоторому внутреннему полю или пытается вызвать виртуальный метод.

Вы должны создать компонент HTTP, прежде чем использовать его:

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

Кроме того, хорошей практикой является то, что вам следует избегать использования глобальных переменных. Вы можете и должны объявить все необходимые переменные как локальные. И убедитесь, что вы отпустите все после того, как закончите.

...