对于某些网站管理员来说最痛苦的事情莫过于每天必做的重复工作譬如从新闻页面中删除旧的新闻标题换上新的新闻标题如果想让读者能看到以前的新闻还要更改随时间改变的FormField值等等用DELPHI编写一个WebServer端的ISAPI程序可以大大减轻工作量 ISAPI方式的服务器端程序有以下特点内存开销小多个客户端链接与一个链接内存开销等同速度快由于DLL运行一次后便常驻内存当有新的链接时直接从内存发送数据有效地提高了速度 我用DELPHI编写的这个程序具有以下功能 根据日期变化自动修改FormField的时间值(此值供浏览器端选择) 自动生成新闻目录管理者只需把新的新闻拷贝至此目录即可程序能自动生成新闻首页的页面 重点 在一个目录中搜索符合条件的文件返回句柄 HANDLE FindFirstFile(LPCTSTR lpFileNameLPWIN_FIND_DATA lpFindFileData); 根据FindFirstFile返回的句柄继续搜索下一个文件 BOOL FindNextFile(HANDLE hFindFileLPWIN_FIND_DATA lpFindFileData ); 关闭指定搜索句柄 BOOL FindClose(HANDLE hFindFile); WIN_FIND_DATA该结构存储FindFirstFile和FindNextFile找到文件的各项信息其结构如下 typedef struct _WIN_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved; DWORD dwReserved; TCHAR cFileName [ MAX_PATH ]; TCHAR cAlternateFileName[ ]; } WIN_FIND_DATA; 程序的action内容 name pathinfo enabled updata WebActionItem /DispNews true 源代码如下 unit Unit; interface uses Windows Messages SysUtils Classes HTTPAppShellApi ExtCtrls; type TWebModule = class(TWebModule) Timer: TTimer; procedure WebModuleupdataAction (Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); procedure WebModuleWebActionItem Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); procedure TimerTimer(Sender: TObject); private { Private declarations } public { Public declarations } end; var WebModule: TWebModule; implementation {$R *DFM} // //本部分是执行不带入口的dll 功能生成新闻中心的首页 //主要目的是下拉菜单的时间动态改变 procedure TWebModule WebModuleupdataAction (Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var DHTML:string; var I:integer; begin DHTML:=< html >; DHTML:=DHTML+< head >; DHTML:=DHTML+< title > 新闻中心< /title >; DHTML:=DHTML+< /head >; DHTML:=DHTML+< body >; DHTML:=DHTML+< p > 请选择日期< /p >; DHTML:=DHTML+< form method=POST action=AutoUpDtdll/DispNews; DHTML:=DHTML+< p > < select size= name=tm >; //下拉列表中包含 前推十天的日期 DHTML:=DHTML+< option selected value=+FormatDateTime(mmdd date)+ >今天< /option >; DHTML:=DHTML+< ption value= +FormatDateTime(mmdd date)+ >昨天< /option >; DHTML:=DHTML+< option value= +FormatDateTime(mmdd date)+ >前天< /option> ; for i:= to do DHTML:=DHTML+< option value= +FormatDateTime(mmdd dateI)+ >+FormatDateTime (m月dd日 dateI)+< /option >; DHTML:=DHTML+< /select > < input type=submit value=提交 name=B >; DHTML:=DHTML+< /p >; DHTML:=DHTML+< /form >; DHTML:=DHTML+< /body >; DHTML:=DHTML+< /html >; ResponseContent:=DHTML; end; //根据request传送的参数 确定要显示的文件目录 //并从该目录中取出所有的htm文件 //如果没有该目录则向浏览器发送提示信息 procedure TWebModule WebModuleWebAction ItemAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Var ReqDir:Tstrings; //保存Request要求的参数 Var DHTMLSeleDir:string; var FileNameData: WIN_FIND_DATA; var SearchFileHandle:THandle; begin ReqDir:=NIL; ReqDir:=Request ContentFields; DHTML:=< html >; DHTML:=DHTML+< head >; DHTML:=DHTML+ < title >新闻中心< /title >; DHTML:=DHTML+ < /head >; DHTML:=DHTML+ < body >; DHTML:=DHTML+ < p align=center > < font face=宋体 size= color=#FF > 新闻中心< /font >< /p >; //DHTML:=DHTML +ReqDirValues[tm]; SeleDir:=ReqDir Values[tm]; // 获得搜索句柄 SearchFileHandle:=FindFirstFile (Pchar(C:\MyWeb\news\+SeleDir+ \*htm)FileNameData); if SearchFileHandle< > INVALID_HANDLE_VALUE then begin DHTML:=DHTML+< P >< a href=/+SeleDir+/ +FileNameDatacFileName+ > +FileNameDatacFileName+ < /a >< /p >; //根据搜索句柄向后搜索 while FindNextFile (SearchFileHandle FileNameData ) do DHTML:=DHTML+< P >< a href=/+SeleDir+/ +FileNameDatacFileName+ >+FileNameDatacFileName+ < /a >< /p >; //关闭搜索句柄 fileClose(SearchFileHandle); end else DHTML:=DHTML+对不起没有您需要的新闻; DHTML:=DHTML+< /body >; DHTML:=DHTML+< /html >; ResponseContent:=DHTML; end; //在上午八点到九点之间 Timer被激发一次创建下一天的文件夹 procedure TWebModule TimerTimer(Sender: TObject); begin if FormatDateTime(h time)= then mkdir(IntToStr(StrToInt (FormatDateTime(mmdd date))+)); end; end; 实际使用时可根据自己的需要将已有的Web页面编辑进程序中同时编写合适的时间处理函数修改FormField的值也是必须的因为在本程序中并未涉及到月初月末时间变化 |