📄 010.htm
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI专题--网络应用-->DELPHI与INTERNET(二)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI专题--网络应用 DELPHI与INTERNET(二)">
<META NAME="description" CONTENT=" - DELPHI专题--网络应用 - DELPHI与INTERNET(二)">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<a href="index4.html">返回</a>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">DELPHI与INTERNET(二)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p>FTP 使用 WININET <br>
<br>
现在您阅读的是本文的第二部分,它包含了WININET的内容。正如前文提及的那样, 这个部分与第一部分完全无关。 <br>
<br>
让我们先来对您在FTP部分使用WININET DLL时需要编写的代码作一个做一个概括的了解。这并不是一个详尽的学习,但却能够让您进门。为了知晓这项技术,您要做的第一件 事情是明白 WININET.PAS 中的一些函数返回的是一个叫做 HINTERNET 类的指针变量: <br>
<br>
<br>
var <br>
HINTERNET: Pointer; <br>
<br>
这个指针扮演一个您正在使用的不同的因特网服务的句柄的角色。获得了这个句柄之后,你应当把它作为第一个参数传递给在这个进程周期[注:指FTP的整个存在时间(译者)]中调用的其他WININET函数。 <br>
<br>
您要记住的适当您在使用它的时间内要把句柄返回给系统,通常是通过调用 WININET 函数 InternetCloseHandle 来实现: <br>
<br>
<br>
function InternetCloseHandle(hInet: HINTERNET): BOOL; stdcall; <br>
<br>
为了让一个WININET进程开始,您调用 InternetOpen : <br>
<br>
function InternetOpen(lpszCallerName: PChar; dwAccessType: DWORD; <br>
lpszServerName: PChar; nServerPort: INTERNET_PORT; <br>
dwFlags: DWORD): HINTERNET; stdcall; <br>
<br>
<br>
第一个参数时打开这个进程的应用程序的名字。您可以在这个参数中传递任何您所要 的任意符串。微软公司的文献声称"这个名字作为HTTP协议中的用户代理器的名字而被使用"。这个保留的参数可以设为0或空。 <br>
<br>
<br>
var <br>
MyHandle: HINTERNET; <br>
… <br>
begin <br>
MyHandle := InternetOpen('MyApp', 0, nil, 0, 0); <br>
end; <br>
<br>
如果您想要关于这个函数的更多信息,从 www.microsoft.com 那里下载 <br>
WININET.HLP 。 <br>
<br>
打开了这这个进程之后,下一步是通过 InternetConnect 函数来连接到服务器上。 <br>
<br>
<br>
function InternetConnect( <br>
hInet: HINTERNET; // Handle from InternetOpen <br>
lpszServerName: PChar; // Server: i.e., www.borland.com <br>
nServerPort: INTERNET_PORT; // Usually 0 <br>
lpszUsername: PChar; // usually anonymous <br>
lpszPassword: PChar; // usually your email address <br>
dwService: DWORD; // FTP, HTTP, or Gopher? <br>
dwFlags: DWORD; // Usually 0 <br>
dwContext: DWORD): // User defined number for callback <br>
HINTERNET; stdcall; <br>
<br>
这里有三个可能的可以通过 dwService 参数传递的自说明旗标,它们是互斥的: <br>
<br>
<br>
INTERNET_SERVICE_FTP <br>
INTERNET_SERVICE_GOPHER <br>
INTERNET_SERVICE_HTTP <br>
<br>
下面是 dwFlags 参数的选择: <br>
<br>
<br>
INTERNET_CONNECT_FLAG_PASSIVE <br>
<br>
这个选项仅当您在前一个参数中传递了 INTERNET_SERVER_FTP 才有效。这时候这个 参数没有其他有效的选项。 <br>
<br>
<br>
如果这个进程成功的话会返回一个有效的指针,否则它返回空。 <br>
<br>
<br>
连接上之后 <br>
<br>
当您连接上之后,您可以调用来 GetCurrentDirectory 获得当前的路径的名字: <br>
<br>
<br>
function TMyFtp.GetCurrentDirectory: string; <br>
var <br>
Len: Integer; <br>
S: string; <br>
begin <br>
Len := 0; <br>
ftpGetCurrentDirectory(FFTPHandle, PChar(S), Len); <br>
SetLength(S, Len); <br>
ftpGetCurrentDirectory(FFTPHandle, PChar(S), Len); <br>
Result := S; <br>
end; <br>
<br>
这个函数声明如下: <br>
<br>
<br>
function FtpGetCurrentDirectory( <br>
hFtpSession: HINTERNET; // handle from InternetConnect <br>
lpszCurrentDirectory: PChar; // directory returned here <br>
var lpdwCurrentDirectory: DWORD): // buf size of 2nd parameter <br>
BOOL; stdcall; // True on success <br>
<br>
如果您把最后一个参数设为0,那么WININET会使用这个参数来返回路径字符串的长度 。接着您可以为您的字符串分配内存,也可以在调用一次这个函数来获得路径的名字。这 个过程在上面的方法中已经演示过了。(注意到*设定长度*的那个调用,Delphi要求您在类似这样的情况下为新的长字符串分配内存!这是因为这个字符串必须在操作系 统中指定值,而不是在 Delphi 应用程序中指定。结果就是 Delphi 不能在类似的情况下(像它通常那样悄悄地为字符串分配内存) <br>
下面是返回在特定路径下当前可用的文件的一系列函数: <br>
<br>
<br>
function GetFindDataStr(FindData: TWin32FindData): string; <br>
var <br>
S: string; <br>
Temp: string; <br>
begin <br>
case FindData.dwFileAttributes of <br>
FILE_ATTRIBUTE_ARCHIVE: S := 'A'; <br>
// FILE_ATTRIBUTE_COMPRESSED: S := 'C'; <br>
FILE_ATTRIBUTE_DIRECTORY: S := 'D'; <br>
FILE_ATTRIBUTE_HIDDEN: S := 'H'; <br>
FILE_ATTRIBUTE_NORMAL: S := 'N'; <br>
FILE_ATTRIBUTE_READONLY: S := 'R'; <br>
FILE_ATTRIBUTE_SYSTEM: S := 'S'; <br>
FILE_ATTRIBUTE_TEMPORARY: S := 'T'; <br>
else <br>
S := IntToStr(FindData.dwFileAttributes); <br>
end; <br>
S := S + GetDots(75); <br>
Move(FindData.CFilename[0], S[6], StrLen(FindData.CFileName)); <br>
Temp := IntToStr(FindData.nFileSizeLow); <br>
Move(Temp[1], S[25], Length(Temp)); <br>
Result := S; <br>
end; <br>
<br>
function TMyFtp.FindFiles: TStringList; <br>
var <br>
FindData: TWin32FindData; <br>
FindHandle: HInternet; <br>
begin <br>
FindHandle := FtpFindFirstFile(FFtphandle, '*.*', <br>
FindData, 0, 0); <br>
if FindHandle = nil then begin <br>
Result := nil; <br>
Exit; <br>
end; <br>
FCurFiles.Clear; <br>
FCurFiles.Add(GetFindDataStr(FindData)); <br>
while InternetFindnextFile(FindHandle, @FindData) do <br>
FCurFiles.Add(GetFindDataStr(FindData)); <br>
InternetCloseHandle(Findhandle); <br>
GetCurrentDirectory; <br>
Result := FCurFiles; <br>
end; <br>
<br>
这里需要注意的关键函数是 ftpFindFirstFile, InternetFindNextFile & InternetCloseHandle 。您可以像调用 Delphi 函数 FindFirst、FindNext & FinClose 一样调用这些函数。特别的是,您使用函数 tpFindFirstFile 来取得这个路径下的第一 个函数。您可以不断地调用 InternetFindNextFile ,直到函数返回"False"为止。当这个进程结束时,调用 InternetCloseHandle 来通知操作系统回收与这个进程相关的内存。 <br>
我不准备在这里进一步解析这个进程。如果您想要更多的信息,您可以在 Delphi 帮助中查找 FindFirst 。最后提醒一句:并不向前文提及的函数,TWin32FindData 并不 是在 WININET.PAS 中定义的, 但可以在随 Delphi 分发的 WIN32 帮助文件中找到它。 它在随 Delphi 分发的 WINDOWS.PAS 文件中被定义。 <br>
<br>
FTP 使用 WININET <br>
<br>
现在您阅读的是本文的第二部分,它包含了WININET的内容。正如前文提及的那样, 这个部分与第一部分完全无关。 <br>
<br>
让我们先来对您在FTP部分使用WININET DLL时需要编写的代码作一个做一个概括的了 解。这并不是一个详尽的学习,但却能够让您进门。为了知晓这项技术,您要做的第一件 事情是明白 WININET.PAS 中的一些函数返回的是一个叫做 HINTERNET 类的指针变量: <br>
<br>
<br>
var <br>
HINTERNET: Pointer; <br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -