Почему я получаю нарушение прав доступа при копировании ресурса в веб-ответ? - PullRequest
2 голосов
/ 13 марта 2012

Я следовал учебнику здесь , чтобы узнать, как включить файл в 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, так как этот ресурс должен передаваться обратно как контент (как поток), когда /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), я получаю нарушение прав доступа.Веб-браузер на стороне клиента получает то же сообщение об ошибке, что и содержимое «файла PNG».

AV

Так почему же это происходит?Что я делаю не так?

1 Ответ

6 голосов
/ 13 марта 2012

Вы получаете нулевой указатель.Вероятно, это Response.ContentStream, то есть свойство, которое вы должны присвоить , а не read . Документация гласит:

Примечание. Если значение свойства ContentStream не равно nil, свойство Content игнорируется.

Это говорит о том, что ContentStream может быть нулевым.Таким образом, вам нужно присвоить ему значение, если вы хотите его использовать:

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

Документация дополнительно объясняет:

Если вы используете ContentStream собственность, не освобождайте поток самостоятельно.Веб-объект ответа автоматически освобождает его для вас.

...