Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Написание CGI-приложения посредством Delphi   Найти похожие ветки 

 
Интернетчик   (2004-06-03 02:38) [0]

Мне необходимо создать CGI-приложение именно на Delphi, а не на Perl, например. Причина в том, что я использую функции сжатия, шифрования данных, и это у меня написано и работает на Delphi, Надо, чтобы программа работала в качестве полноценного CGI скрипта... Например, мне присылают (POSTом) данные, мне нужно их обработать, как в простой прорамму, и сгенерировать ответ. И также важно, чтобы это дело не весило пол
мегабайта из-за форм.
Подскажите, пожалуйста...


 
piople ©   (2004-06-03 04:32) [1]

Так в чем проблема то??? Работай с cgi скриптом по средством консольного приложения!
Хотя честно говоря лучше всего их писать в виде библиотек ISAPI или NSAPI.
Но раз надо малый размер, то пиши консольное приложение.

Пример:
Моя библиотека для работы с общим шлюзовым интерфейсом(CGI):

unit cgiwork;

interface
uses SysUtils, Windows;

function HexToInt(CH : char): integer;
function Decode(Value: string; CH: String): string;
function ParamByName(Name: string; CH: String): string;
function LowCase(ch: Char) : Char;
function ChangeChar(Value, CHOld, CHNew: String): string;
function GetEV(Param: String): String;

implementation

// Полечение переменной сетового окружения
function GetEV(Param: String): String;
begin
result := GetEnvironmentVariable(PChar(Param));
end;

// Функция замены символов в строке
function ChangeChar(Value, CHOld, CHNew: String): string;
begin
 while Pos(CHOLD, Value) > 0 do
   Value := Copy(Value,0,Pos(CHOld, Value)-1) + CHNew + Copy(Value,Pos(CHOld, Value) + Length(CHOld),Length(Value));

 result := Value;
end;

// Переделываем буквы в нижний регистр
function LowCase(ch: Char): Char;
begin
 Result := ch;
 case Result of
 "А".."Я":  Dec(Result, Ord("А") - Ord("а"));
 "A".."Z":  Dec(Result, Ord("A") - Ord("a"));
 end;
end;

// Переделываем из Hex в Int
function HexToInt(CH : char): integer;
begin
 Result:=0;
 case CH of
   "0".."9": Result:=Ord(CH)-Ord("0");
   "A".."F": Result:=Ord(CH)-Ord("A")+10;
   "a".."f": Result:=Ord(CH)-Ord("a")+10;
 end;
end;

// Декодировать параметр
function Decode(Value: string; CH: String): string;
var
 i, L: integer;
begin
 Result:="";
 L:=0;

 Value := ChangeChar(Value, "%0D%0A", " ");

 for i := 1 to Length(Value) do
 begin
   if(Value[i] <> "%") and (Value[i] <> "+") and (L<1) then
   begin
     Result := Result + Value[i];
   end
   else
   begin
     if(Value[i] = "+") then
       Result := Result + " "
     else if(Value[i] = "%") then
     begin
       L := 2;
       if(i < Length(Value) - 1) then
       begin
         Result := Result + Chr(HexToInt(Value[i+1]) * 16 +
    HexToInt(Value[i+2]));
       end;
     end
     else
       Dec(L);
   end;
 end;
end;

// Получаем значение переметра
function ParamByName(Name: string; CH: String): string;
var
 SS, ST : string;
 K : integer;
begin
 Result := "";

 if GetEnvironmentVariable(PChar("REQUEST_METHOD")) = "GET" then  SS := GetEnvironmentVariable(PChar("QUERY_STRING"));

 while Length(SS) <> 0 do
  begin
   K := Pos("&",SS);
   if (K <> 0) then
   begin
     ST := Copy(SS,1,K-1);
     SS := Copy(SS,K+1,10000);
   end
    else
    begin
     ST :=SS;
     SS:="";
   end;
   K := Pos("=",ST);
   if(K <> 0) then
   begin
     if(Name = Copy(ST,1,K-1)) then
     begin
       Result := Decode(Copy(ST,K+1,6000), CH);
     end;
   end;
 end;
end;

end.


Ну и сам пример консольного приложения:

program AddWord;
{$APPTYPE CONSOLE}
{$E cgi}

uses
 SysUtils,
 Windows,
 cgiwork;

var
 Name, Mail, Text : string;

begin
// Получаем Name, Mail, Text
 Name := ParamByName("nameUs", " ");  //Второй параметр указыае на что заменять каретку перехода на новую строку
 Mail := ParamByName("mailUs", " ");
 Text := ParamByName("Soobj", " ");

 WriteLn("Content-Type: text/html");
 WriteLn;
 WriteLn;
 WriteLn("<HTML>");
 WriteLn("<HEAD>");
 WriteLn("<META http-equiv=Content-Type content="text/html; charset=windows-1251">");
 WriteLn("<META content="MSHTML 6.00.2800.1106" name=GENERATOR>");
 WriteLn("</HEAD>");

 WriteLn("<TABLE cellSpacing=1 cellPadding=1 width="100%" border=0>");
 WriteLn("<TR>");
 WriteLn("<TD >Полученные данные</TD></TR>");
 WriteLn("<TR>");
 WriteLn("<TD colSpan=4 height=20>");

 WriteLn("<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>");

 WriteLn("<TR>");
 WriteLn("<TD align=Middle><font color=#CCFFFF>");

 WriteLn("<TR><TD><FONT color=#99FFFF>");

 WriteLn("<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>");
 WriteLn("<TR><TD colSpan=7></TD></TR>");
 WriteLn("<TR ><TD colSpan=7></TD></TR>");
 WriteLn("<TR class=TABL vAlign=center><font color=#ffffff><TD align=center width=100%>");

 WriteLn("<P align=justify id=mysample>   ");
 WriteLn("<center>Name: " + Name + "</center>");
 WriteLn("<center>Mail: " + Mail + "</center>");
 WriteLn("<center>Text: " + Text + "</center>");
 WriteLn("
");

 WriteLn("</Table>");
 WriteLn("</TBody>");
 WriteLn("</HTML>");

end.


Ну как вызвать я думаю сам додумаешься. Вообщем так передаешь 3-и перематра скрипту методо GET. Ну и само сабой не забудь IIS поставить.

З.Ы. Если что не понятно пиши на аську или мыло.



Страницы: 1 вся ветка

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
14-1089906817
CHES
2004-07-15 19:53
2004.08.01
Ваше отношение к советской попсе


1-1089898891
DSKalugin
2004-07-15 17:41
2004.08.01
закраска в StringGrid


4-1087732883
Minori
2004-06-20 16:01
2004.08.01
Можно ли отследить нажатие Win+[какая нибудь клавиша]?


1-1090240379
Dmitry
2004-07-19 16:32
2004.08.01
MDI Application


1-1089987052
Клафк
2004-07-16 18:10
2004.08.01
В Делфи 6 неизвестная ошибка!