Получение IStream от OleVariant
Я использую Delphi вместе с WinHTTP для выполнения HTTP-запроса на загрузку некоторых файлов из Интернета, и я могу выполнить запрос, но я не знаю, как получить IStream из OleVariant, который возвращается из ResponseStream
, Я потратил много времени на поиск в Google, но не могу понять, как это сделать. Вот что я попробовал:
var
req: IWinHTTPRequest;
instream: IStream;
begin
req := CoWinHTTPRequest.Create;
req.Open('GET', 'http://google.com', false);
req.Send('');
if req.Status <> 200 then
begin
ShowMessage('failure'#10 + req.StatusText);
FreeAndNil(req);
Application.Terminate;
end;
instream := req.ResponseStream as IStream;
ShowMessage('success');
FreeAndNil(instream);
FreeAndNil(req);
end;
Но я получаю ошибку [DCC Error] main.pas(45): E2015 Operator not applicable to this operand type
(строка 45 instream := req.ResponseStream as IStream;
).
Как мне напугать IStream из OleVariant?
1 ответ
Попробуй это
instream := IUnknown(req.ResponseStream) as IStream;
Редактировать 1 Вы не должны вызывать FreeAndNil для интерфейса. FreeAndNil может быть передан только экземпляр объекта. Невыполнение этого условия приводит к исключению. Так как интерфейсы в любом случае считаются ссылками, вы можете просто позволить им выйти из области видимости, и они будут очищены. Итак, вам нужно удалить:
FreeAndNil(instream);
FreeAndNil(req);
Edit2: попытка объяснить, что происходит
Пожалуйста, не стесняйтесь редактировать или дополнять, если вы считаете, что это не правильно или если это можно объяснить лучше.
req.ResponseStream
является OleVariant
, as
Ключевое слово делает вызов QueryInterface
и это не реализовано OleVariant
,
OleVariant
имеет встроенное преобразование типов из OleVariant
в IUnknown
так что вам нужно сначала разыграть OleVariant
в IUnknown
а затем использовать as
оператор, чтобы сделать QueryInterface
для того, чтобы получить IStream
интерфейс.
Вы не можете разыграть OleVariant
прямо к IStream
потому что нет встроенного преобразования типа из OleVariant
в IStream
,