DELPHI开发Web程序常见问题

原创 2001年12月22日 13:06:00
引子
  Web程序开发对开发工具提出了极大挑战,面对用户的众多需求,许多公司推出一大堆开发平台:开发桌面应用程序和C/S程序的,开发中间件的,开发Web服务器的。这造成程序员面对一大堆工具无从下手。

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

  DELPHI将ISAPI/NSAPI/CGI/WCGI等巧妙地封装成一个类,用户只要在编译时选择编译结果,就可以得到不同的系统。
  在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=″/scripts/mydll.dll/picture″〉〈/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 := ′image/jpeg′;
   Response.ContentStream := S;

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

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

  
如何在ISAPI/NSAPI动态连接库(DLL)中使用本地数据库驱动程序(native Access driver)?
  这是因为DAO 3.0 或者DAO 3.5是所谓thread-safe(线程安全程序),而一个Web服务器(例如IIS)会随用户请求产生多个线程,同时把ISAPI对应的DLL也列为线程。这时ISAPI就会通过BDE通知DAO,告诉它不符合线程安全规定。

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

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

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

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

  你如果要为访问的用户(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 Service(实例)(续,用Delphi编写客户端)

继昨天晚上一文:http://blog.csdn.net/yxf/archive/2006/09/28/1303281.aspx ,现在写写用Delphi来编写客户端的方法。同样还是调用昨晚的libs...
  • yxf
  • yxf
  • 2006年09月29日 09:51
  • 2575

Web 开发常见安全问题

不是所有 Web 开发者都有安全的概念,甚至可能某些安全漏洞从来都没听说过。这就是这篇科普文章的存在意义,希望 Web 开发者在开发时能依此逐条检查代码中的安全问题。 注:服务器运维相关的安全注意事...
  • fengyinchao
  • fengyinchao
  • 2016年03月01日 19:46
  • 10727

DELPHI XE5开发WEB服务器及安卓手机客户端

Xe5开发web服务端和手机客户端 时间:2013-9-18 17:09:45 点击: 6456 Delphi xe5作为最新开发利器,就类似如当年的DELPHI,功能强大,快发速度快,把...
  • long102
  • long102
  • 2013年12月02日 17:07
  • 2460

用Delphi开发Web服务数据库程序

第一步:编写服务器的应用程序 首先在Delphi的IDE中选择”File|New|Other…”,然后在WebServices页面中选择Soap Server Application图标。 然后在...
  • manstar
  • manstar
  • 2012年01月27日 20:33
  • 949

032_《Delphi下用Intraweb开发WEB程序应用实战(第二版)》

IntraWeb是Delphi自带的一套Web开发框架,它由Atozed Software公司(http://www.atozedsoftware.com)在2002年制作,并完美的植入Delphi7...
  • shuaihj
  • shuaihj
  • 2010年12月01日 17:12
  • 5609

创建 Delphi DataSnap 程序的问题集萃(4)

(本文所讨论的开发环境,为 Delphi XE5)     最近有点小忙,博客只能忙里偷闲地写了。     本篇介绍如何在客户端和服务器端之间传递数据。     我本人很不喜欢在页面上频繁地使用数据感...
  • dongfirst
  • dongfirst
  • 2014年01月20日 23:22
  • 1134

我的又一次面试经历---难道真的抛弃delphi,要用java了么?

       昨天接到电话通知,所以今天起了一个大早,饭也没顾上吃就奔目的地了----对于每一个面试机会我都是认真对待.本地高新区的一个科技园区,我尽然费了好大的周折才找到!其中为了节省时间,不至于给...
  • IUPRG
  • IUPRG
  • 2007年03月28日 13:54
  • 1262

Delphi调试WEB程序(ISAPI或CGI)

1.新建一个web工程,请选中最下面一项:Web App Debugger executable,Coclass name我们设为demo1; 2.在弹出的WebModule2中右击,在弹出...
  • zhongguoren666
  • zhongguoren666
  • 2011年11月11日 11:00
  • 1258

老程序员之DELPHI XE5之手机应用开发案例之一

Delphi EX5发布已有一年了,本人通过其已实现了几个小的手机应用,评价如下: 1)EX5稳定性和性能都得到了很好的提升,至少目前没有感觉任何不适; 2)真正实现了一次编码,多版本发布的目标,无论...
  • whye1974
  • whye1974
  • 2013年12月09日 17:54
  • 2421

Delphi开发的WebService如何和Tomcat集成

随着B/S程序得到越来越广的应用,Delphi由开发C/S程序的主战场逐步转移到以开发WebService后台服务程序为主。由于我们前台通常用JSP作为脚本语言,因此Tomcat作为简单的Web服务器...
  • fjclc2008
  • fjclc2008
  • 2012年06月24日 22:33
  • 2457
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DELPHI开发Web程序常见问题
举报原因:
原因补充:

(最多只允许输入30个字)