用Delphi写CGI的问题(100分)

  • 主题发起人 主题发起人 erx
  • 开始时间 开始时间
E

erx

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用delphi写控制台程序,直接作为CGI程序来运行。
遇到了一个问题,怎样得到从网页POST来的数据?

其它的比如环境变量可以通过GetEnvironmentVariable函数来得到
而POST该怎样取得呢?

谢谢!

(我不想用Delphi的Web Application来写,编译后太庞大了)
 
比如:getenvironmentvariable(s2,s1,255)
将其中的s2设为参数'QUERY_STRING'便可得到网页上传来的数据,方法与得到别的参数一样
不过,如果传来的数据是中文的,则必须进得ascll向二进制码的转换
 
下面是vb的代码,谁可以翻译一下成delphi啊?

CGI程序的初始化工作
  hStdIn = GetStdHandle(STD_INPUT_HANDLE)
  hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)
  CGI_RequestMethod = Environ("REQUEST_METHOD")
  CGI_QueryString = Environ("QUERY_STRING")
  CGI_ContentLength = Environ("CONTENT_LENGTH")
  lContentLength = Val(CGI_ContentLength)

  sBuff = String(lContentLength, Chr$(0)) # 就是这句

  OutPut "Content-type: text/html" & vbCrLf
  If CGI_RequestMethod = "POST" Then

   sBuff = String(lContentLength, Chr$(0)) # 还有这句

   rc = ReadFile(hStdIn, ByVal sBuff, lContentLength, lBytesRead, ByVal 0&)
   sFormData = Left$(sBuff, lBytesRead)
  ElseIf CGI_RequestMethod = "GET" Then
   sFormData = CGI_QueryString
  Else
   OutPut "Unknow Form Method !"
  End If
 
我记得VB中的string,是一个函数---是生成长度为Param1的Param2的字符串。
你可用S: PChar/ C: array [0..nSize] of Char;
然后FillChar()来初始化
 
getenvironmentvariable(s2,s1,255)

中s1 不可以是字符串,他说需要pchar

我该怎么办?
 
那就:
var
S1: PChar;
begin
Size := 255;
GetMem(S1, Size);
GetEnvironmentVariable(S2, S1, 255);
...
end;
 
program post;
{$APPTYPE CONSOLE}
uses
Windows,SysUtils;
var
MyPointer: PChar;
begin
write('Content-type: text/html');
writeln;
writeln;
MyPointer := GetEnvironmentStrings;
if MyPointer <> nil then
while MyPointer <> nil do
begin
writeln('Look:'+StrPas(MyPointer)+'<br>');
Inc(MyPointer,StrLen(MyPointer)+1);
if (Byte(MyPointer[0]) = 0) then MyPointer := nil;
end;
FreeEnvironmentStrings(MyPointer);
end.

我这样做了,并且把它放到iis里面跑,用张html页POST数据给他
但是发现他对POST的数据根本就没有反应,也就是说POST的数据根本就没有,
不过POST长度的环境变量存在,也正常

如何得到POST的数据啊
 
下面就是直接从标准输入接口读入网页POST数据的CGI程序,完全利用纯Pascal语言实现,没有使用Web Application模块:

var
I,StdIn,StdOut: Integer;
S: string;
Variable:string;
Buffer:array [0..4095] of char;
begin
StdIn:= GetStdHandle(STD_INPUT_HANDLE);
StdOut:= GetStdHandle(STD_OUTPUT_HANDLE);
S:= '';
SetString(Variable, Buffer, GetEnvironmentVariable(PChar('CONTENT_LENGTH'), Buffer, SizeOf(Buffer)));
I:= StrToInt(Variable);
if I <= 0 then exit;
FileSeek(StdIn, 0, FILE_BEGIN);
SetString(S, nil, I);
FileRead(StdIn, S[1], I); //S中的内容就是网页POST给CGI程序的数据
 
正想准备研究CGI
 
那么你的上一贴就是标准答案。

你说这分该怎么办?自己给自己么?
 
后退
顶部