用Delphi写CGI的问题 我不想用Delphi的Web Application来写只生成控制台程序 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Delphi的Internet编程:CGI Web服务器应用程序是一种控制台应用程序。WinCGI 是一种GDI应用程序,当然仍只是非可视应用程序。你说的“ 我在用delphi写控制台程序,...,我不想用Delphi的Web Application来写,编译后太庞大了”可能是误解,不可能很大嘛。编译要选择Build with runtime package。示例: Guest.htm文件中有一行代码定义用户单击Submit按钮时发生的动作(把表单的数据提交给服务器):<form method="post"action="guestbk.dll/form"> 路径为/form的WebActionItem对象通过Request.ContentFields特性来访问收集到的数据。唉,我讲的够清楚了,给分吧。var MyPage: TStringList; ParamsList: TParamsList;begin begin ParamsList := TParamsList.Create; try ParamsList.AddParameters(Request.ContentFields); GBTable.Open; GBTable.Append; GBTable.FieldByName('Name').Value := ParamsList['fullnameText']; GBTable.FieldByName('EMail').Value := ParamsList['emailText']; GBTable.FieldByName('WhereFrom').Value := ParamsList['wherefromText']; GBTable.FieldByName('Comments').Value := ParamsList['commentsTextArea']; GBTable.FieldByName('FirstTime').Value := CompareStr(ParamsList['firstVisitCheck'], 'on') = 0); GBTable.FieldByName('DateTime').Value := Now; GBTable.Post; except Response.Content := 'An Error occurred in processing your data.'; Handled := True; end; finally ParamsList.Free; GBTable.Close; end; 用Delphi的Web Application来编写CGI程序,体积的确比较大,最小都有300K。不过,你可以用Aspack压缩这个CGI程序,压缩后体积只有150K左右。使用Web Application的好处是方便快捷,Delphi已帮你做了很多复杂的底层工作(例如环境变量中的参数解码),而且可以与数据库实现无缝连接。其实,如果你要直接使用纯Pascal语言来编写CGI程序,也是可以的,不过就要靠你自己编写底层的解码函数了。 可是我想了解一下,它到底是怎样读POST数据的,我看了HTTPApi CGIApi 很乱,也大概看了RFC-HTTP 1.0晕乎乎的,谁可以给一点提示也行啊。(60分我不愿意老是吊在这里,可问题总也没有头绪) 采用CGI Stand-Alone 模式编译出来的CGI程序,是通过环境变量来传递参数的。Web Server会首先传递给CGI程序一个名为"CONTENT_LENGTH"的环境变量,里面存放了缓冲区的大小,然后CGI程序将根据这个数值,从标准输入接口读入相应字节数的数据。数据读入后,要进行解码,以便还原出POST给CGI程序的不同参数。如果你打算直接使用纯Pascal语言来编写CGI程序,就要自己编写上述的底层处理函数了。虽然实现起来比较复杂,但是编译出来的CGI程序体积非常小。我试了一下,仅有6K左右,呵呵。 ****************************************** 从标准输入接口读入相应字节数的数据。******************************************我想知道的就是这个,该怎么读?READLN好像不行,我试过快,这是问题的最后一步了,只要搞懂这个马上结账:) 下面就是直接从标准输入接口读入网页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程序的数据 Businessskinform 编辑skn皮肤文件 浮生偷得半月闲,有没需要帮做小系统的(6月中旬前有效)? 初学者请各位大哥帮帮小弟 重载的问题(别以为简单),分少了没人问 + 分 高手请进透明窗体的做法,可控制透明度,透明范围 请问delphi中有的标识符前的 _(下划线) 这个符号是什么意思呀? belllab,你有DevExpress系列 For D7版的下载地址吗? 操作系统题(求救!) 用sql语句,怎样取最后10条记录。 AdoDataset控件的问题 Delphi 很吃内存哦! Shiori Player X alpha 测试开始!!!!
WinCGI 是一种GDI应用程序,当然仍只是非可视应用程序。你说的“ 我在用delphi写控制台程序,...,我不想用Delphi
的Web Application来写,编译后太庞大了”可能是误解,不
可能很大嘛。编译要选择Build with runtime package。示例:
Guest.htm文件中有一行代码定义用户单击Submit按钮时发生的
动作(把表单的数据提交给服务器):<form method="post"action="
guestbk.dll/form"> 路径为/form的WebActionItem对象通过Request.ContentFields特
性来访问收集到的数据。唉,我讲的够清楚了,给分吧。
var
MyPage: TStringList;
ParamsList: TParamsList;
begin
begin
ParamsList := TParamsList.Create;
try
ParamsList.AddParameters(Request.ContentFields);
GBTable.Open;
GBTable.Append;
GBTable.FieldByName('Name').Value :=
ParamsList['fullnameText'];
GBTable.FieldByName('EMail').Value :=
ParamsList['emailText'];
GBTable.FieldByName('WhereFrom').Value :=
ParamsList['wherefromText'];
GBTable.FieldByName('Comments').Value :=
ParamsList['commentsTextArea'];
GBTable.FieldByName('FirstTime').Value :=
CompareStr(ParamsList['firstVisitCheck'], 'on') = 0);
GBTable.FieldByName('DateTime').Value := Now;
GBTable.Post;
except
Response.Content := 'An Error occurred in
processing your data.';
Handled := True;
end;
finally
ParamsList.Free;
GBTable.Close;
end;
晕乎乎的,谁可以给一点提示也行啊。(60分我不愿意老是吊在这里,可问题总也没有头绪)
我想知道的就是这个,该怎么读?
READLN好像不行,我试过快,这是问题的最后一步了,只要搞懂这个马上结账
:)
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程序的数据