I am using Delphi along with WinHTTP to do an HTTP request to download some files from the internet, and I can do the request but I don't know how to get the IStream from the OleVariant that is returned from ResponseStream
. I have spent a lot of time googling but I can't figure out how to do it. Here is what I have tried:
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;
But I get the error [DCC Error] main.pas(45): E2015 Operator not applicable to this operand type
(line 45 is instream := req.ResponseStream as IStream;
).
How do I scare the IStream out of an OleVariant?
Try this
Edit 1 You must not call FreeAndNil on an interface. FreeAndNil can only be passed an object instance. Failure to do so results in an exception. Since interfaces are reference counted anyway you can simply let them go out of scope and they will be cleaned up. So, you need to remove:
Edit2: A try to explain what is going on
Please feel free to edit or complement if you think this is not accurate or if it can be explained better.
req.ResponseStream
is anOleVariant
. Theas
keyword is doing a call toQueryInterface
and that is not implemented byOleVariant
.OleVariant
has a built in type conversion fromOleVariant
toIUnknown
so you need to first cast theOleVariant
toIUnknown
and then use theas
operator to do aQueryInterface
in order to get theIStream
interface.You can not cast a
OleVariant
directly to aIStream
because there is no built in type conversion fromOleVariant
toIStream
.