登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - Delphi 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

Delphi开发Web程序常见问题
发表日期:2005-05-26作者:[转贴] 出处:  

  Web程序开发对开发工具提出了极大挑战,面对用户的众多需求,许多公司推出一大堆开发平台:开发桌面应用程序和CS程序的,开发中间件的,开发Web服务器的。这造成程序员面对一大堆工具无从下手。

  DELPHI和其他开发工具不同,因为它是一个开放系统,只要灵活使用一些控件,即可开发出各种类型的
系统,不论N-Tie程序、多线程程序、分布计算程序(包括DCOM和CORBAR)、TCP程序、Web程序、ActiveX、中间件、推程序(Push),甚至你可以用它来写汇编程序。

  DELPHI将ISAPINSAPICGIWCGI等巧妙地封装成一个类,用户只要在编译时选择编译结果,就可以得到不同的系统。

  在DELPHI4中Inprise公司进一步加强了对Web程序开发的支持,可以开发出更好更强的系统。以下是开发Web应用程序中的几个常见问题,可以供大家参考。如果没有特别申明,则表示程序运行于 DELPHI 4下。

  如何从Web Server Application返回一幅图像?

  Web Server Application不仅可以生成复杂的页面文档,也可以根据用户请求返回不同的图像。当然有比较简单的方法,根据输入参数不同,〈img src...〉标记也指向不同的URL地址。这里我们不用这个办法,而是利用DLL返回图像。
  当然要首先建立一个页面容器( page producer),内容如下:
  <html>
  <body>This is a test<BR><img src=″scriptsmydll.dllpicture″></body>
  <html>

  接下来我们设定对应于PathInfo的动作事件,返回图像结果,源代码如下:
  (注意:单元声明中要包含JPEG单元)

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;Request:
TWebRequest; Response: TWebResponse; var Handled: Boolean);
  var
   Jpg: TJpegImage;
S: TMemoryStream;
  begin
   Jpg := TJpegImage.Create;
   try
   Jpg.LoadFromFile(′test′);
   S := TMemoryStream.Create;
   try
   Jpg.SaveToStream(S);
   S.Position := 0;
   Response.ContentType := ′imagejpeg′;
   Response.ContentStream := S;

   // 必须在流释放前完成
   Response. SendResponse;
   finally
   S.Free;
    end;
  finally
   Jpg.Free;
  end;
end;

  实际上用这种方法和前面提到的简单做法相比,具有更安全和更灵活的特点。在某些地方灵活使用,以此为基础稍加修改可以产生一般开发工具难以实现的效果。

  如何在ISAPINSAPI动态连接库(DLL)中使用本地数据库驱动程序(native Access driver)?

  这是因为DAO 3.0 或者DAO 3.5是所谓thread-safe(线程安全程序),而一个Web服务器(例如IIS)会随用户请求产生多个线程,同时把ISAPI对应的DLL也列为线程。这时ISAPI就会通过BDE通知DAO,告诉它不符合线程安全规定。

  解决的方法有很多,如果你一定要访问Access 9597库,那么可以通过ODBC访问。ODBC不会经过DAO,而且也是一个线程安全程序。此外还有一些第三方的控件集,通过他们可以直接由BDE访问Access 9597,效率更高。

  用户访问我Web服务器上的ISAPI DLL,可是报告:“Invalid filename"(无效的文件名),然而文件的确存在的。对了,我的数据库在一台Novell 服务器上。这是为什么呢?

  你没有设定对应于你IUSR_XXX账户的驱动器路径映射(MAPING)。因为Novell不是采用FAT,所以要手
工添加路径映射。当然,可以做成开机登录脚本。请牢记,如果你运行IIS作为Web服务器,而又涉及Novell,无论作为文件服务器或数据库服务器,都要定义好路径映射。

  “Invalid configuration parameter for alias {alias_name}"(无效的别名配置),当我设置一个ODBC DSN,并通过它访问ISAPINSAPI服务器时就出现这样一个错误。

  你如果要为访问的用户(IIS用户)建立一个ODBC别名,那么要注意创建一个SYSTEM DSN(系统DNS),而不要创建“用户DNS”,虽然“用户DNS”是缺省设定。
  如何取得客户机(访问机器)的名称和IP地址?

  实现这个功能用TCP控件来做非常容易。从Internet页面上选取一个TCP控件,然后直接就可以得到你所需要的:
  Memo1.Lines.Add(TCP1.LocalHostName);
  Memo1.Lines.Add(TCP1.LocalIp);

  当然,如果你不希望这样做,还有比较复杂的办法:
  uses Winsock;
  procedure TForm1.FormCreate(Sender: TObject);
  var
  wVersionRequested : WORD;
  wsaData : TWSAData;
  begin
   {创建 WinSock}
   wVersionRequested := MAKEWORD(1, 1);
   WSAStartup(wVersionRequested, wsaData);
  end;

  
  procedure TForm1.Button1Click(Sender: TObject);
  var
p : PHostEnt;
s : array[0..128] of char;
p2 : pchar;
  begin
   {得到计算机名称}
   GetHostName(@s,128);
   p:=GetHostByName(@s);
   Memo1.Lines.Add(p^.h_Name);

    {得到机器IP地址}
   p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
   Memo1.Lines.Add(p2);
  end;

  procedure TForm1.FormDestroy(Sender: TObject);
  begin
   {释放 WinSock}
   WSACleanup;
  end;

  这是一个调用了WINSOCK的独立单元,你可以把它直接嵌入到你的程序中去。

  在DELPHI 3中为何不能创建真正的多线程DLL?

  虽然DELPHI3中的ISAPI DLL向导已经为创建多线程DLL生成了大量代码,可是还是有一个严重的缺陷:没有申明本应用程序是一个多线程的程序。所以需要你添加一句话:

  IsMultiThread := TRUE;

  把这句话放在DPR程序begin-end块的开始处,使之成为第一句。

  
  如何得知现在是否和Internet连接?

  最简单的办法是用一个TCP元件得到自己当前的IP,通过判断IP得知是否连入Internet。例如:
   if TCP1.LocalIp = '0.0.0.0' then
   ShowMessage('目前没有连入Internet!');

  需要注意的是:因为Internet和Intranet没本质区别,所以一般不能判定是和Internet连接还是仅仅连入Intranet。当然。你也可以再加一个PING元件,去PING一个比较稳定、速度比较快的站点,如果连通则表明已经接入Internet。不过这种办法通用性不好。


  如何打印一个Web页面?

  可以选用HTML控件的AutoPrint方法。例如:
  uses Printers;

  procedure TForm1.Button1Click(Sender: TObject);
  var
   OldCur: TCursor;
  begin
  OldCur := Screen.Cursor;
  with Printer do
begin
   BeginDoc;
   HTML1.AutoPrint(handle);
   Title := HTML1.URL;
   EndDoc;
  end;

  Screen.Cursor := OldCur;
  end;

  此外还可以利用其PrintPage方法。不过我推荐你采用AutoPrint,因为这样控制更灵活,可以过滤一些
你不希望打印的内容。
  结语

  最后我还要向你推荐几套DELPHI 编写Web程序的增强控件集,它们是:

  1)CGI Expert 4 由Lars German公司出品,编写 shell-CGI、 win-CGI、 ISAPI和NSAPI程序特别方便。

  2)NetMaster的Internet控件集。DELPHI 4中的Internet控件集就是它们的杰作,和 DELPHI结合得非常好。你可以去下载它们的最新版,功能更强大,而且对 DELPHI用户是免费的。

  3)Dart Communications出品的PowerTCP的确非常强大,如果编写专业级TCP应用程序必不可少。有很多功能实际是由DLL提供的。

 

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 Delphi开发Web程序常见问题

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00184