Newsgroup: it.comp.lang.delphi
Titolo: Problemi con un CGI

Salve,
ha trovato questo CGI che dovrebbe funzionare in modo simile ad un
contatore, solo che invece di indicare il numero dei visitatori, scrive la
frase:"Hello world!". E' stato fatto per far comprendere il meccanismo di
trasmissione dati sever/client.
Io non ho potuto provarlo (sono in attesa che finiscano le pratiche di
registrazione).
Qualcuno saprebbe dirmi se funziona?
Potreste dirmi dove trovare informazioni su THandleStream e TMemoryStream
(nella mia guida "completa" sul Delphi non ho trovato nulla!!)?
Dovrei aver capito occhio e croce come funziona, ma non perchč!!
----------------------------------------
CODICE ---------------------------------------
Program CGI1;
uses Windows,
  Classes,
  Graphics,
  JPEG;
var
  HandleStr : THandleStream;
  MemStream : TMemoryStream;
  Immagine  : TBitmap;
  ImmagineJPG: TJPEGImage;
Begin
  Immagine := TBitmap.Create;
  Immagine.Canvas.FillRect(Rect(0,0,100,100));
  Immagine.Canvas.Font.Color := clRed;
  Immagine.Canvas.TextOut(10,50,'Hello world!');
  ImmagineJPG := TJPEGImage.Create;
  ImmagineJPG.Assign(Immagine);
  ImmagineJPG.CompressionQuality:=100;
  HandleStr := THandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE));
  MemStream := TMemoryStream.Create;
  ImmagineJPG.SaveToStream(MemStream);
  MemStream.SaveToStream(HandleStr);
  HandleStr.Free;
  MemStream.Free;
  Immagine.Free;
  ImmagineJPG.Free;
end.
--------------------------------------- FINE
CODICE ---------------------------------------------
GRAZIE MILLE!!
--
        ************************************
       *                      BiiO                         *
      *   
http://members.xoom.it/BiiO/
      *
       *            
fab...@tiscalinet.it
             *
        *************************************

 Dovrei aver capito occhio e croce come funziona, ma non perchè!!
    Il codice è molto lineare, se però ci dici dove non lo capisci, forse ti
possiamo aiutare...
    Saluti!
______________________________________
Gian Luca Dalla Torre
E - Mail: 
gianluca....@casteo.net
______________________________________

Ciao,
grazie della risposta.
Il problema è che non ho trovato nulla sulla funzione
  GetStdHandle(STD_OUTPUT_HANDLE);
e visto che tutto parte da qui....
Spero di non dire una bestialità, ma credo che si tratti di un API di
Windows (si dovrebbe infatti trovare in windows.pas).
In particolare quella funzione dovrebbe restituire l'indirizzo dell'immagine
contenuta nella pagina che viene visitata. Io credo si tratti di questo, ma
non ho trovato nulla nella documentazione.
Dove devo cercare?


>
Il problema è che non ho trovato nulla sulla funzione
  GetStdHandle(STD_OUTPUT_HANDLE);
e visto che tutto parte da qui....
Spero di non dire una bestialità, ma credo che si tratti di un API di
Windows (si dovrebbe infatti trovare in windows.pas).
<<
Win32.hlp: "The GetStdHandle function returns a handle for the standard
input, standard output, or standard error device."
che io sappia, i programmi CGI scrivono l'output (html) sullo stdout.
Sul mio server (PeerWebServer) non funziona: dovresti almeno mettere un
header e un footer. (writeln(<HTML><HEAD>...</HEAD><HTML>). Non so come si
possa passare una iimmagine creata dinamicamente; è invece piuttosto
semplice se la salvi su disco e passi l'indirizzo (filename) con gli
opportuni tag.
(devi ovviamente avere un permesso di scrittura sulla directory del
server).
hth
Paolo Arosio
ps: mi sono permesso di adattare il tuo esempio:
--------------------------------------------------------
Program Cgi2;
{$APPTYPE CONSOLE}
uses
  Windows,
  SysUtils,
  Classes,
  Graphics,
  JPEG;
var
  MemStream : TMemoryStream;
  Immagine  : TBitmap;
  ImmagineJPG: TJPEGImage;
  fn: Array[0..MAX_PATH] of char;
  F: TSearchRec;
  jfn: TFilename;
  i: integer;
const
  Head: string = '<HTML>'#13#10'<HEAD><TITLE>Senza
titolo</TITLE></HEAD>'#13#10;
  Foot: string = '</HTML>';
  Root: String = '.';
  Prefix: String = 'Tmp';
begin
  if (ParamCount > 1) and (Pos('CLEAR', UpperCase(Paramstr(1))) > 0) then
begin
    try
      if FindFirst('.\tmp*.jpg', faAnyFile, F) = 0 then repeat
          DeleteFile(F.Name);
          if FindNext(F) <> 0 then break;
      until false;
    finally
      FindClose(F);
    end;
    writeln(Head);
    writeln('<P>Directory cleared<P>');
    for i := 0 to Paramcount do
      writeln(Format('<P>Param %d: %s', [i+1, Paramstr(i)]));
  end
  else begin
    Immagine := TBitmap.Create;
    Immagine.Canvas.Font.Color := clRed;
    Immagine.Canvas.Font.Size := 24;
    Immagine.Canvas.Font.Style := [fsBold];
    Immagine.Height := 3*Immagine.Canvas.TextHeight('X');
    Immagine.Width := 3*Immagine.Canvas.TextWidth('Hello world!');
    Immagine.Canvas.TextOut(10,50,'Hello world!');
    ImmagineJPG := TJPEGImage.Create;
    ImmagineJPG.Assign(Immagine);
    ImmagineJPG.CompressionQuality:=100;
    MemStream := TMemoryStream.Create;
    writeln(Head);
    Writeln('See this image:<P>');
    if Windows.Gettempfilename(PChar(Root), PChar(Prefix), 0, fn) > 0 then
begin
      jfn := ExtractFileName(fn);
      jfn := ChangeFileExt(jfn, '.jpg');
      ImmagineJPG.SaveToStream(MemStream);
      MemStream.SaveToFile(jfn);
      writeln('<IMG SRC="./' + jfn + '>');
      Writeln('<P>STATIC<P>');
      DeleteFile(fn);
    end;
    writeln('<P><a href="./cgi2.exe?clear">Pulisci</a><P>');
    writeln(Foot);
    MemStream.Free;
    Immagine.Free;
    ImmagineJPG.Free;
  end;
end.


    Il fatto è che i CGI "scrivono" i risultati su Standard OutPut (il
Prompt di MS-DOS per capirsi), questi poi vengono inviati direttamente al
browser che li legge come se fosse una pagina HTML.
    Nel tuo caso, visto che il CGI "scrive" un immagine, questa deve essere
collegata mediante TAG ad una pagina HTML già esistente. Quando il tuo
browser richiede la pagina, chiede al server di risolvere il link del CGI e
quindi arriva su Standard Output la scritta "Hello World" che vedrai nel tuo
browser.
    Il tuo CGI non l'ho provato, perché lavoro su server Linux, però penso
che dovrebbe funzionare. Ti consiglio di installarti Personal Web Server (il
server Web minore di casa Microsoft per W98) e provare il tuo CGI...
    Se hai altri problemi, chiedi pure!!!


Non ho il tempo di risponderti dettagliatamente, ma ti mando alcuni link
dove troverai quello che ti serve (documentazione e demo):
http://www.acadians.com/delpisap.htm
http://inner-smile.com/delphit.htm
 sezione internet
da quest'ultimo in particolare puoi trovare materiale davvero interessante,
anche il link ad un sito con un contatore scritto in delphi.
C'e' poi il sito di Dr Bob - sezione internet
Ciao e buon lavoro.
Paolo

 ha scritto nel
messaggio news:_jO45.267856$VM3.2...@news.infostrada.it...



    Nel CD di Windows 98 o nel CD di FrontPage (se ce l'hai)!
    Saluti!
--


 ha scritto nel
messaggio news:n3q55.277536$VM3.2...@news.infostrada.it...
