2012-03-13 47 views
2

我按照教程here了解如何在EXE中包含文件。虽然我成功地获得了一个PNG图像编译,但在使用它时,我却不成功。当我将资源复制到Web响应中时,为什么会出现访问冲突?

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作为此资源作为内容(作为流)传回,当从网络服务器请求/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

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

回答

6

您正在访问空指针。这可能是Response.ContentStream,这是一个属性,你应该转让,而不是读取The documentation这样说:

注意:如果ContentStream属性的值不为零,则内容属性被忽略。

这表明ContentStream可能为零。因此,你需要的,如果你想使用它的值赋给它:

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

文档进一步解释:如果您使用ContentStream财产

,不释放自己的流。 Web响应对象会自动为您释放它。

+0

+1和接受(很快),作品像一个魅力,谢谢! – 2012-03-13 17:34:31

相关问题