Netto->Clear();
Income->Clear();
AssetsCost->Clear();
Netto->AddXY(1, 2, "", clTeeColor);
Income->AddXY(3, 4, "", clTeeColor);
AssetsCost->AddXY(5, 6, "", clTeeColor);
AnsiString FileName = "test.wmf";
Chart->SaveToMetafile(FileName);
printf("\nContent-type: image/wmf\n\n");
int h = FileOpen(FileName, fmOpenRead | fmShareDenyWrite), fs;
fs = FileSeek(h, 0, 2);// file size
FileSeek(h, 0, 0);
AnsiString str;
str.SetLength(fs);
FileRead(h, (void*)str.data(), fs);
FileClose(h);
printf(str.c_str());// по идее, это вывод в stdout
DeleteFile(FileName);
Вывод картинки-TChart'а в HTML-страницу
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>test chart</title>
</head>
<body>
</body>
</html>
<html>
<head>
<title>test chart</title>
</head>
<body>
</body>
</html>
p.exe -- приложение, написанное на C++ Builder, в котором на Chart'e рисуется диаграмма (в разные моменты времени своя). Не пойму, как правильно составить HTTP-ответ. Вот кусок кода, который я написал, почитав доки и форумы в сети (Netto, Income и AssetsCost -- экземпляры TBarSeries):
Код:
При запросе браузеру отобразить chtest.html никакого результата не наблюдается. Может быть, HTTP-заголовок неправильный?
1. Надо переназначить STDOUT, по умолчанию, вроде, стоит "CON" - на экран консоли.
2. Можно попробывать не удалять файл сразу.
Цитата:
Originally posted by miXme
Значит есть 2 идеи:
1. Надо переназначить STDOUT, по умолчанию, вроде, стоит "CON" - на экран консоли.
2. Можно попробывать не удалять файл сразу.
Значит есть 2 идеи:
1. Надо переназначить STDOUT, по умолчанию, вроде, стоит "CON" - на экран консоли.
2. Можно попробывать не удалять файл сразу.
1. Добавил
Код:
setvbuf(stdout, NULL, _IONBF, 0);
результат тот же.
2. Какая разница, сразу удалять файл или позже? Я ведь его прочитал и отправил в поток. То, что в потоке, с файлом уже никак не связано.
трудности, а потом пытаются их героически преодолеть... :)
Что мешает сделать новое приложение CGI из готового шаблона Web Server Application,
выбрать при создании CGI stand-alone executable..
А если очень интересно как это работает - расковырять исходники.
И книжку купить хорошую...
Цитата:
Originally posted by ART-CODE
Что мешает сделать новое приложение CGI из готового шаблона Web Server Application,
выбрать при создании CGI stand-alone executable..
А если очень интересно как это работает - расковырять исходники.
И книжку купить хорошую...
Что мешает сделать новое приложение CGI из готового шаблона Web Server Application,
выбрать при создании CGI stand-alone executable..
А если очень интересно как это работает - расковырять исходники.
И книжку купить хорошую...
Спасибо за наводку на CGI stand-alone executable. Только работа спорится почему-то лишь с content-type: text/html. HTML-страницы передать -- пожалуйста. А картинку не получается.
Код:
void __fastcall TWM::WMWebActionItemAction(TObject *Sender,
TWebRequest *Request, TWebResponse *Response, bool &Handled)
{
AnsiString FileName = CreateClassID()+".wmf";
Form2->Chart1->SaveToMetafile(FileName);
fs = new TFileStream(FileName, fmOpenRead | fmShareDenyWrite);
Response->ContentType = "image/wmf";
Response->ContentStream = fs;
Response->SendResponse();
}
TWebRequest *Request, TWebResponse *Response, bool &Handled)
{
AnsiString FileName = CreateClassID()+".wmf";
Form2->Chart1->SaveToMetafile(FileName);
fs = new TFileStream(FileName, fmOpenRead | fmShareDenyWrite);
Response->ContentType = "image/wmf";
Response->ContentStream = fs;
Response->SendResponse();
}
Не помогает. Все нипочем. Не возвращается картинка при запросе вроде [FONT=courier new] http://site/p.exe[/FONT]. А в тех же "хороших" книжках (которые и покупать-то не надо, в сети полным-полно; англоязычных -- точно) ВСЕ примеры построены на возврате браузеру text/html. Про остальные mime-типы написано что-то вроде "для остальных mime-типов код аналогичен" :)
"Программирование для интернет в C++Builder 6"
А.В. Козлова
используется TMemoryStream, и перед
присвоением ContentStream = fs; выполняется
установка курсора потока в "0"
Может поможет...
Код:
TMemoryStream* fs=new TMemoryStream();
fs->LoadFromFile(FileName);
fs->Position=0;
Response->ContentType = "image/wmf";
Response->ContentStream = fs;
fs->LoadFromFile(FileName);
fs->Position=0;
Response->ContentType = "image/wmf";
Response->ContentStream = fs;
Цитата:
Originally posted by ART-CODE
Может поможет...
Может поможет...
Код:
TMemoryStream* fs=new TMemoryStream();
fs->LoadFromFile(FileName);
fs->Position=0;
Response->ContentType = "image/wmf";
Response->ContentStream = fs;
fs->LoadFromFile(FileName);
fs->Position=0;
Response->ContentType = "image/wmf";
Response->ContentStream = fs;
Уже определенно лучше. Но при загрузке все той же страницы в браузер теперь вылезает сообщение: [FONT=courier new]Ошибка CGI Указанное приложение CGI не возвратило полный набор заголовков HTTP. Не возвращены заголовки:[/FONT]
и все. Это единственные символы на странице.
В отладчике посмотри что вовращает str.c_str(). Если действительно есть в начале что-то вроде "JFIF", "GIF" или "Photoshop X.X" (признаки графического файла), то значит действительно надо колдовать с возвратом.
На твоем месте, я бы не был так уверен по поводу присутствия данных в потоке. Для операционной системы характерной чертой является свойство "подбирать" за завершившимися приложениями. А в твоем случае p.exe как раз завершилось! Пройдись дебаггером по своим мозгам (с) ;-)
Цитата:
Originally posted by waterman
Уже определенно лучше. Но при загрузке все той же страницы в браузер теперь вылезает сообщение: [FONT=courier new]Ошибка CGI Указанное приложение CGI не возвратило полный набор заголовков HTTP. Не возвращены заголовки:[/FONT]
и все. Это единственные символы на странице.
Уже определенно лучше. Но при загрузке все той же страницы в браузер теперь вылезает сообщение: [FONT=courier new]Ошибка CGI Указанное приложение CGI не возвратило полный набор заголовков HTTP. Не возвращены заголовки:[/FONT]
и все. Это единственные символы на странице.
Глюки, по-видимому, были из-за того, что у меня в CGI-приложении была еще одна форма с чартом, которая создавалась автоматически в начале работы приложения. Когда я ее перенес в Available forms и создавал динамически при передаче диаграммы, все пошло гладко.
Код:
void __fastcall TWebModule1::WebModule1WebActionItem1Action(
TObject *Sender, TWebRequest *Request, TWebResponse *Response,
bool &Handled)
{
Form2 = new TForm2(this);
AnsiString FileName = CreateClassID() + ".wmf";
Form2->Chart1->SaveToMetafile(FileName);
TMemoryStream *ms = new TMemoryStream();
ms->LoadFromFile(FileName);
DeleteFile(FileName);
ms->Position = 0;
Response->ContentType = "image/wmf";
Response->ContentStream = ms;
}
TObject *Sender, TWebRequest *Request, TWebResponse *Response,
bool &Handled)
{
Form2 = new TForm2(this);
AnsiString FileName = CreateClassID() + ".wmf";
Form2->Chart1->SaveToMetafile(FileName);
TMemoryStream *ms = new TMemoryStream();
ms->LoadFromFile(FileName);
DeleteFile(FileName);
ms->Position = 0;
Response->ContentType = "image/wmf";
Response->ContentStream = ms;
}
Всем большое спасибо за участие!