将资源复制到Web响应时,为什么会出现访问冲突?

时间:2012-03-13 17:24:27

标签: delphi stream embedded-resource web-applications

我按照教程here了解如何在EXE中包含文件。虽然我成功地编译了PNG图像,但在使用它时,我没有成功。

MyResources.rc

LOGO_PNG RCDATA Resources\Logo.png

MyConsoleUnit.pas

const
  RES_LOGO_PNG = 'LOGO_PNG';

implementation

{$R *.dfm}
{$R 'MyResources.res' 'MyResources.rc'}

现在这对我来说有点让人困惑。我必须处理所有流,没有文件。我已将此PNG图像Logo.png嵌入此资源,以便在从Web服务器请求/Logo.png时作为内容(作为流)传回。我还遵循了一个非常基本的教程:

procedure TMyWebConsole.MyWebConsoleLogoAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  RS: TResourceStream;
begin
  RS := TResourceStream.Create(HInstance, RES_LOGO_PNG, RT_RCDATA);
  try
    Response.ContentType:= 'image/png';
    RS.SaveToStream(Response.ContentStream);
  finally
    RS.Free;
  end;
end;

问题是,当调用此函数时(SaveToStream),我得到访问冲突。客户端上的Web浏览器收到与“PNG文件”内容相同的错误消息。

AV

那为什么要这样做呢?我做错了什么?

1 个答案:

答案 0 :(得分:6)

您正在访问空指针。它可能是Response.ContentStream,这是您应该分配的属性,而不是读取The documentation说:

  

注意:如果 ContentStream 属性的值不是nil,则忽略 Content 属性。

这表明ContentStream可能是零。因此,如果要使用它,则需要为其分配值:

Response.ContentStream := TResourceStream.Create(HInstance, RES_LOGO_PNG, RT_RCDATA);

文档进一步解释:

  

如果您使用 ContentStream 属性,请不要自行释放流。 Web响应对象会自动为您释放它。