⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 56.htm

📁 水木清华的BBS文章
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://bbs.tsinghua.edu.cn"><font face="黑体"><big><big>水木清华★</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">         Delphi编程                            (BM: strayli FlyingBoy)          </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="454"> <p align="center">[<a href="index.htm">回到开始</a>][<a href="10.htm">上一层</a>][<a href="57.htm">下一篇</a>]
<hr><p align="left"><small>  <br>

                             DELPHI AND THE INTERNET <br>

                                  by Charlie Calvert <br>

  <br>

由Boen翻译,转载请注明: Translate by Boen. <br>

  <br>

中文译稿版权属Boen所有,使用权归 CNM 编程版 <br>

  <br>

《第二》 <br>

------------------------------------------------------------------------------ <br>

-- <br>

  <br>

FTP 使用 WININET <br>

  <br>

    现在您阅读的是本文的第二部分,它包含了WININET的内容。正如前文提及的那样, <br>

这个部分与第一部分完全无关。 <br>

  <br>

    让我们先来对您在FTP部分使用WININET DLL时需要编写的代码作一个做一个概括的了 <br>

解。这并不是一个详尽的学习,但却能够让您进门。为了知晓这项技术,您要做的第一件 <br>

事情是明白 WININET.PAS 中的一些函数返回的是一个叫做 HINTERNET 类的指针变量: <br>

  <br>

  <br>

var <br>

var <br>

  HINTERNET: Pointer; <br>

  <br>

    这个指针扮演一个您正在使用的不同的因特网服务的句柄的角色。获得了这个句柄之 <br>

后,你应当把它作为第一个参数传递给在这个进程周期[注:指FTP的整个存在时间(译者 <br>

)]中调用的其他WININET函数。 <br>

  <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>

    第一个参数时打开这个进程的应用程序的名字。您可以在这个参数中传递任何您所要 <br>

的任意符串。微软公司的文献声称"这个名字作为HTTP协议中的用户代理器的名字而被使 <br>

用"。这个保留的参数可以设为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>

          // 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>

连接上之后 <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会使用这个参数来返回路径字符串的长度 <br>

。接着您可以为您的字符串分配内存,也可以在调用一次这个函数来获得路径的名字。这 <br>

个过程在上面的方法中已经演示过了。(注意到*设定长度*的那个调用,Delphi <br>

要求您在类似这样的情况下为新的长字符串分配内存!这是因为这个字符串必须在操作系 <br>

统中指定值,而不是在 Delphi 应用程序中指定。结果就是 Delphi 不能在类似的情况下 <br>

像它通常那样悄悄地为字符串分配内存) <br>

  <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_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>

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 & <br>

InternetCloseHandle 。您可以像调用 Delphi 函数 FindFirst、FindNext & FinClose <br>

一样调用这些函数。特别的是,您使用函数 ftpFindFirstFile 来取得这个路径下的第一 <br>

个函数。您可以不断地调用 <br>

InternetFindNextFile ,直到函数返回"False"为止。当这个进程结束时,调用 <br>

InternetCloseHandle 来通知操作系统回收与这个进程相关的内存。 <br>

  <br>

  <br>

     我不准备在这里进一步解析这个进程。如果您想要更多的信息,您可以在 Delphi <br>

帮助中查找 FindFirst 。最后提醒一句:并不向前文提及的函数,TWin32FindData 并不 <br>

是在  WININET.PAS 中定义的, 但可以在随 Delphi 分发的 WIN32 帮助文件中找到它。 <br>

它在随 Delphi <br>

分发的 WINDOWS.PAS 文件中被定义。 <br>

  <br>

FTP 使用 WININET <br>

  <br>

    现在您阅读的是本文的第二部分,它包含了WININET的内容。正如前文提及的那样, <br>

这个部分与第一部分完全无关。 <br>

  <br>

    让我们先来对您在FTP部分使用WININET DLL时需要编写的代码作一个做一个概括的了 <br>

解。这并不是一个详尽的学习,但却能够让您进门。为了知晓这项技术,您要做的第一件 <br>

事情是明白 WININET.PAS 中的一些函数返回的是一个叫做 HINTERNET 类的指针变量: <br>

  <br>

  <br>

var <br>

  HINTERNET: Pointer; <br>

  <br>

    这个指针扮演一个您正在使用的不同的因特网服务的句柄的角色。获得了这个句柄之 <br>

后,你应当把它作为第一个参数传递给在这个进程周期[注:指FTP的整个存在时间(译者 <br>

)]中调用的其他WININET函数。 <br>



  <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>

    第一个参数时打开这个进程的应用程序的名字。您可以在这个参数中传递任何您所要 <br>

的任意符串。微软公司的文献声称"这个名字作为HTTP协议中的用户代理器的名字而被使 <br>

用"。这个保留的参数可以设为0或空。 <br>

  <br>

  <br>

var <br>

  MyHandle: HINTERNET; <br>

… <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>

  <br>

    当您连接上之后,您可以调用来 GetCurrentDirectory 获得当前的路径的名字: <br>

  <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>

  <br>

    如果您把最后一个参数设为0,那么WININET会使用这个参数来返回路径字符串的长度 <br>

。接着您可以为您的字符串分配内存,也可以在调用一次这个函数来获得路径的名字。这 <br>

个过程在上面的方法中已经演示过了。(注意到*设定长度*的那个调用,Delphi <br>

要求您在类似这样的情况下为新的长字符串分配内存!这是因为这个字符串必须在操作系 <br>

统中指定值,而不是在 Delphi 应用程序中指定。结果就是 Delphi 不能在类似的情况下 <br>

像它通常那样悄悄地为字符串分配内存) <br>

  <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>

     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 & <br>

InternetCloseHandle 。您可以像调用 Delphi 函数 FindFirst、FindNext & FinClose <br>

一样调用这些函数。特别的是,您使用函数 ftpFindFirstFile 来取得这个路径下的第一 <br>

个函数。您可以不断地调用 <br>

InternetFindNextFile ,直到函数返回"False"为止。当这个进程结束时,调用 <br>

InternetCloseHandle 来通知操作系统回收与这个进程相关的内存。 <br>

  <br>

I'm not going to explain this process further in this newsletter. If you want <br>

more information, you might look up FindFirst in the Delphi help. One final <br>

note: Unlike the functions mentioned in the previous paragraph, <br>

TWin32FindData is not defined in <br>

WININET.PAS, but instead can be found in the WIN32 help file that ships with <br>



Delphi. It is declared in the WINDOWS.PAS file that ships with Delphi. <br>

     我不准备在这里进一步解析这个进程。如果您想要更多的信息,您可以在 Delphi <br>

帮助中查找 FindFirst 。最后提醒一句:并不向前文提及的函数,TWin32FindData 并不 <br>

是在  WININET.PAS 中定义的, 但可以在随 Delphi 分发的 WIN32 帮助文件中找到它。 <br>

它在随 Delphi <br>

分发的 WINDOWS.PAS 文件中被定义。 <br>

============================================================================== <br>

==== <br>

  <br>

接受一个文件 <br>

  <br>

您可以使用 WININET.PAS 文件中的 ftpGetFile 函数来从FTP取回一个文件: <br>

  <br>

function FtpGetFile( <br>

  hFtpSession: HINTERNET;        // Returned by InternetConnect <br>

  lpszRemoteFile: PChar;         // File to get <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -