问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?
虽然DELPHI 3中的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提供的。