我按照教程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文件”内容相同的错误消息。
那为什么要这样做呢?我做错了什么?
答案 0 :(得分:6)
您正在访问空指针。它可能是Response.ContentStream
,这是您应该分配的属性,而不是读取。 The documentation说:
注意:如果 ContentStream 属性的值不是nil,则忽略 Content 属性。
这表明ContentStream可能是零。因此,如果要使用它,则需要为其分配值:
Response.ContentStream := TResourceStream.Create(HInstance, RES_LOGO_PNG, RT_RCDATA);
文档进一步解释:
如果您使用 ContentStream 属性,请不要自行释放流。 Web响应对象会自动为您释放它。