小编Oke*_*key的帖子

德尔福装配块中的异常行为

我正在使用Delphi的内联汇编遇到一些奇怪的行为,正如这个非常简短的程序所示:

program test;

{$APPTYPE CONSOLE}

uses
    SysUtils;

type
    TAsdf = class
    public
        int: Integer;
    end;

    TBlah = class
    public
        asdf: TAsdf;

        constructor Create(a: TAsdf);

        procedure Test;
    end;

constructor TBlah.Create(a: TAsdf);
begin
    asdf := a;
end;

procedure TBlah.Test;
begin
    asm
        mov eax, [asdf]
    end;
end;

var
    asdf: TAsdf;
    blah: TBlah;

begin
    asdf := TAsdf.Create;

    blah := TBlah.Create(asdf);

    blah.Test;

    readln;
end.
Run Code Online (Sandbox Code Playgroud)

这只是举例的缘故(mov荷兰国际集团[asdf]eax没有做太多,但它工作的例子).如果你看看这个程序的程序集,你会看到

mov eax, [asdf]
Run Code Online (Sandbox Code Playgroud)

已经变成了

mov eax, ds:[4]
Run Code Online (Sandbox Code Playgroud)

(由OllyDbg代表)显然崩溃了.但是,如果你这样做:

var
    temp: TAsdf;
begin
    temp := …
Run Code Online (Sandbox Code Playgroud)

delphi assembly instance-variables basm

6
推荐指数
2
解决办法
416
查看次数

从OleVariant获取IStream

我正在使用Delphi和WinHTTP来执行HTTP请求以从Internet下载一些文件,我可以执行请求但我不知道如何从返回的OleVariant获取IStream ResponseStream.我花了很多时间谷歌搜索,但我无法弄清楚如何做到这一点.这是我尝试过的:

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;
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误[DCC Error] main.pas(45): E2015 Operator not applicable to this operand type(第45行instream := req.ResponseStream as IStream;).

如何从OleVariant中吓跑IStream?

delphi ole istream winhttprequest delphi-2010

3
推荐指数
1
解决办法
1885
查看次数