分享
 
 
 

DELPHI开发Web程序常见问题

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

引子

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,因为这样控制更灵活,可以过滤一些你不希望打印的内容。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有