精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..技术文章连载..〓〓>>VB邮件>>vb邮件(5.12)

主题:vb邮件(5.12)
发信人: msnet()
整理人: cobe(1999-12-17 11:41:17), 站内信件
                      vb邮件(5.12)
===================================

a VB5应用程序对系统配置参数的确定  

对于程序员而言,了解系统配置的情况对应用程序的开发具有重要的意义。在开
发诸如多媒体应用、图形软件等与系统配置密切相关的软件时,由于用户机器配
置不尽相同,所以,由软件在执行时动态获取这些配置参数以确定执行流程,则
是软件能否顺利运行的至关重要的因素。这里指的系统配置是Windows 95操作系
统的系统配置。程序员对系统物理配置的信息经常需要了解的是中央处理器类型
、物理内存、虚拟内存、外部存储器、Windows路径、显示器和打印机信息等。 

  Visual Basic是一套优秀的软件开发工具,现已成为覆盖微软大部分桌面产
品的程序设计语言。Visual Basic 5.0的专业版和企业版引入了本机代码、Acti
veX文档、多线程环境、分布式COM和远程自动化工具等功能,将Visual Basic应
用程序推到了一个更高的境界。但是VB5并没有直接给出获取系统配置参数的语句
或函数,而是需要程序员利用Windows的应用程序接口(API)来获取这些参数。
Windows API是为C或C++程序员而设计的,对于一般VB程序员而言,要深入应用W
indows API是很困难的,本文将给出通过调用Win32 API来确定系统配置的基本方
法。 

   

  一.Win32 API基本概念和调用 

  Windows的32位应用程序接口(Win32 API)包含1000多个复杂的函数和几百
种Windows常量、消息和结构,使得程序员可以用不同类型的程序设计语言开发出
运行在Windows 95和Windows NT操作系统上的应用程序。C和C++语言可以访问全
部Windows的消息和用法,而VB就无法能全部访问到,但是通过使用Win32 API可
以扩展VB来超越基本的属性、方法和事件,使得程序对系统拥有更大的控制权和
灵活性。 

  Win32 API包括以下四种常用的函数类型。 

  1.Windows Management(User) 

  提供基本的窗口构造块和建立管理程序输入显示、检索用户输入的函数,通
过Win32 API的Windows Management层为应用程序创建和管理用户界面。Windows
 Management支持动态数据交换DDE(Dynamic Data Exchange)一类的系统功能和
剪贴板函数。 

  2.Graphics Device Interface(GDI) 

  提供支持系统中已有的物理设备和逻辑设备的功能,如监视器、打印机、内
存设备描述表等。通过GDI可以定义不同的绘图对象,提供了画线、圆和其他形状
的功能,对位图操作提供有力的支持。 

  3.System Server(Kernel) 

  提供了访问系统资源和工具的途径,包括内存、文件系统、运行处理等等。
VB透过访问和使用动态链接库(DLL:Dynamic Link Libraries),如API或自定
义DLL,从这里可以获取操作系统控制下的设备参数和改变其工作状态。 

  4.Multimedia 

  提供了对音频(WAV)、MIDI音乐、AVI视频、游戏操纵杆和高精度定时器的
支持。在VB5中对Win32 API的调用是很方便的。Microsoft专门整理了Win32 API
函数中所用到的函数、类型结构声明和全局常量的值,形成的文件WIN32API.TXT
在VB专业版或企业版中放在所在路径下的WINAPI子目录中。在VB5中可以通过两种
途径引用这些整理好的参数:(1)直接启动VB5文件夹中的API文本查看器;(2
)通过VB5编辑环境中的“外接程序管理器”调入API文本查看器。Microsoft有时
对WIN32API.TXT作出修订,公布在其网点上,供用户下载使用。 

   

  二.Windows系统路径的获取 

   应用程序在对操作系统的基本参数进行配置和调用时,必须获取Windows的
安装路径,其中包括system的路径。Win32 API给出了获取Windows和system路径
的函数调用。 

  1.获取Windows的路径 

  Declare Function GetWindowsDirectory Lib "kernel32" Alias _ 

   "GetWindowsDirectoryA" (ByVal lpBuffer As String, _ 

   ByVal nSize As Long) As Long 

  GetWindowsDirectory()属于System Server的函数成员,用于获取Window
s目录的路径名称;GetWindowsDirectoryA是其函数的别名(Alias)。在多数情
况下,当一个API函数被声明时,会使用一个别名来替代真正的函数名,别名提供
了用另一个名称调用API函数的方法。如果API函数名与VB中的保留字相冲突,就
必须使用别名,如GetObject。 

  2.获取system的路径 

  Declare Function GetSystemDirectory Lib "kernel32" Alias _ 

   "GetSystemDirectoryA" (ByVal lpBuffer As String, _ 

   ByVal nSize As Long) As Long 

  GetSystemDirectory()属于System Server的函数成员,用于获取windows
\system目录的路径名称。 

  首先在VB5中新建一个项目,再添加一个模块,在Module1的“声明”部分加
入以下代码。 

  Declare Function GetWindowsDirectory Lib "kernel32" Alias _ 

   "GetWindowsDirectoryA" (ByVal lpBuffer As String, _ 

   ByVal nSize As Long) As Long 

  Declare Function GetSystemDirectory Lib "kernel32" Alias _ 

   "GetSystemDirectoryA" (ByVal lpBuffer As String, _ 

   ByVal nSize As Long) As Long 

  '定义Windows和Windows\system所在路径的全局变量 

  Public WindowsDir As String, WindowsSysDir As String 

  为了防止在API函数调用返回的字符串中出现空格,有必要对其进行处理,去
掉所有空格。VB5没有提供消除字符间空格的函数,所以我们在Module1中编制自
定义函数来完成这个功能。 

  'AllTrim() 删除字符串中的空白字符函数 

  Function AllTrim$(Incoming$) 

   Temp$ = Incoming$ 

   n% = InStr(Temp$, Chr$(0)) 

   If n% Then Temp$ = Left$(Temp$, n% - 1) 

   Temp$ = LTrim$(RTrim$(Temp$)) 

   AllTrim$ = Temp$ 

  End Function 

  在Module1中设立获取windows和system路径的过程: 

  ' WinSysDir --- 获取Windows和Windows\system路径的过程 

  Sub WinSysDir() 

   WindowsDir = Space(144) 

   WindowsSysDir = Space(144) 

  If GetWindowsDirectory(WindowsDir,144) = 0 Or _ 

   GetSystemDirectory(WindowsSysDir, 144) = 0 Then 

   MsgBox "无法定位 Windows 的路径 !", 16, "出现错误" 

   Else 

   WindowsDir = AllTrim$(WindowsDir) 

   WindowsSysDir = AllTrim$(WindowsSysDir) 

   End If 

  End Sub 

  在Form1的Form_Load()事件中调用WinSysDir()就可以获得windows和system
路径的名称,演示代码如下: 

  WinSysDir 

  Debug.Print WindowsDir 

  Debug.Print WindowsSysDir 

  在VB5环境下运行,就会在调试所用的“立即”窗口中给出这两个路径。 

   

  三.驱动器参数的确定 

  Win32 API中的GetDriveType()函数用来识别驱动器类型。该函数只有一个
字符型参数,用以指定希望识别的驱动器号。GetDriveType()函数返回值是一
个长整型数值,不同的数值表示不同的驱动器类型,具体对应关系如下: 

   2---软盘驱动器 

   3---硬盘驱动器 

   4---网络驱动器 

   5---光盘驱动器 

   6---内存驱动器 

  Win32 API的GetDiskFreeSpace()函数可以获得系统中驱动器的容量参数。
 

  建立一个新项目,在Form1的“通用”部分中声明API函数: 

  Private Declare Function GetDriveType Lib "kernel32" Alias "GetDri
veTypeA" _ 

   (ByVal nDrive As String) As Long 

  Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias _ 


   "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, _ 

   lpSectorsPerCluster As Long, lpBytesPerSector As Long, _ 

   lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) 


   As Long 

  Private Const DRIVE_REMOVABLE = 2 ' 可移动驱动器 

  Private Const DRIVE_FIXED = 3 ' 固定驱动器 

  Private Const DRIVE_REMOTE = 4 ' 网络驱动器 

  Private Const DRIVE_CDROM = 5 ' 光盘驱动器 

  Private Const DRIVE_RAMDISK = 6 ' 内存模拟驱动器 

  在窗体Form1中添加三个Label控件和一个ComboBox控件。在Form_Load()和
Combo1_Click()事件中分别编写如下代码。 

  Private Sub Form_Load() 

   Dim Num As Long 

   Dim buff As String 

   Label1.Caption = "" 

   Label2.Caption = "" 

   Label3.Caption = "" 

   For i = 0 To 25 

   buff = Chr$(65 + i) + ":\" 

   Num = GetDriveType(buff) 

   If Num > 1 Then 

   Combo1.AddItem Chr$(65 + i) 

   End If 

   Next i 

   Combo1.Text = "C" 

  End Sub 

   

  Private Sub Combo1_Click() 

   Dim DriveType As Long 

   Dim DriveSize As Long 

   Dim TotalC As Long 

   Dim NumC As Long 

   Dim SectorsC As Long 

   Dim BytesS As Long 

   Dim buff As String 

   

   buff = Combo1.Text + ":\" 

   DriveType& = GetDriveType(buff) 

   Select Case DriveType& 

   Case DRIVE_REMOVABLE 

   Label1.Caption = "这是可移动驱动器" 

   Case DRIVE_FIXED 

   Label1.Caption = "这是固定驱动器" 

   Case DRIVE_REMOTE 

   Label1.Caption = "这是网络驱动器" 

   Case DRIVE_CDROM 

   Label1.Caption = "这是CD - ROM驱动器" 

   Case DRIVE_RAMDISK 

   Label1.Caption = "这是内存模拟驱动器" 

   Case Else 

   Label1.Caption = "这是无效的该驱动器" 

   End Select 

   DriveSize = GetDiskFreeSpace(buff, SectorsC, BytesS, TotalC, NumC


   If DriveSize Then 

   TotalC = TotalC * SectorsC * BytesS 

   NumC = NumC * SectorsC * BytesS 

   Label2.Caption = "该驱动器全部空间 " + _ 

   Str(Val(Format$(NumC, "##########0")) / 1024) + " KBytes" 

   Label3.Caption = "该驱动器剩余空间 " + _ 

   Str(Val(Format$(TotalC, "##########0")) / 1024) + " KBytes" 

   Else 

   Label2.Caption = "" 

   Label3.Caption = "" 

   End If 

  End Sub 

  运行这段程序,通过下拉框来选择系统中存在的驱动器,从而获得其相关参
数。 

   

  四.获取中央处理器的类型 

  Win32 API的GetSystemInfo()函数提供了对CPU类型的判别。首先在窗体F
orm1的“通用”部分中声明对这一函数的调用: 

  Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As 
SYSTEM-INFO) 

  由于SYSTEM-INFO是一个类型,所以还要对其进行定义: 

  Private Type SYSTEM_INFO 

   dwOemID As Long 

   dwPageSize As Long 

   lpMinimumApplicationAddress As Long 

   lpMaximumApplicationAddress As Long 

   dwActiveProcessorMask As Long 

   dwNumberOrfProcessors As Long 

   dwProcessorType As Long 

   dwAllocationGranularity As Long 

   dwReserved As Long 

  End Type 

  Dim SysInfo As SYSTEM—INFO 

  在窗体中添加一个Label控件。将如下代码加到Form_Load()事件中: 

  Call GetSystemInfo(SysInfo) 

  Select Case SysInfo.dwProcessorType 

   Case 386 

   Label1.Caption = "该机器中央处理器类型为: 386" 

   Case 486 

   Label1.Caption = "该机器中央处理器类型为: 486" 

   Case 586 

   Label1.Caption = "该机器中央处理器类型为: 奔腾" 

   Case Else 

   Label1.Caption = "无法判断该机器的中央处理器类型" 

  End Select 

   

  五.获取内存信息 

  利用Win32 API的GlobalMemoryStatus()可以方便地获取系统中物理内存总
量、虚拟内存总量、已用的虚拟内存数量和剩余的虚拟内存数量。 

  在窗体Form1的“通用”部分中声明对GlobalMemoryStatus()函数的调用:
 

  Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As
 MEMORYSTATUS) 

  定义MEMORYSTATUS类型: 

  Private Type MEMORYSTATUS 

   dwLength As Long 

   dwMemoryLoad As Long 

   dwTotalPhys As Long 

   dwAvailPhys As Long 

   dwTotalPageFile As Long 

   dwAvailPageFile As Long 

   dwTotalVirtual As Long 

   dwAvailVirtual As Long 

  End Type 

  Dim MemInfo As MEMORYSTATUS 

  在窗体Form1中添加三个Label控件,分别为Label1、Label2和Label3,在Fo
rm_Load()事件中编写下列代码: 

  Call GlobalMemoryStatus(MemInfo) 

  Label1.Caption = "物理内存总量:" + Str$(MemInfo.dwTotalPhys) + " B
ytes" 

  Label2.Caption = "虚拟内存总量:" + Str$(MemInfo.dwTotalVirtual) + 
" Bytes" 

  Label3.Caption = "已用虚拟内存:" + Str$(MemInfo.dwAvailPhys) + " B
ytes" 

  Label4.Caption = "剩余虚拟内存:" + Str$(MemInfo.dwAvailVirtual) + 
" Bytes" 

   

  六.获取当前显示器的分辨率 

  Win32 API中的GetSystemMetrics()函数提供了这方面的度量参数。在窗体
的“通用”部分中声明调用: 

  Private Declare Function GetSystemMetrics Lib "user32" (ByVal nInd
ex As Long) As Long 

  Const SM_CXSCREEN = 0 

  Const SM_CYSCREEN = 1 

  在窗体中添加一个Label控件,在Form_Load()事件中调用GetSystemMetri
cs()函数来判断当前显示器的分辨率。 

  Dim x As String 

  Dim y As String 

  n = Str(GetSystemMetrics(SM_CXSCREEN)) 

  y = Str(GetSystemMetrics(SM_CYSCREEN)) 

  Label1.Caption = "当前显示器分辨率: " + n + "x" + y 

   

  七.调用MSINFO32.EXE程序 

  在MS Office套件中,Microsoft提供了MSINFO32.EXE实用程序,它较为全面
地为用户提供了系统、打印、DLL、字体、校对、图形过滤器、文本转换器、显示
、音频、视频、CD-ROM、OLE注册表、活动模块、输入法等信息。该程序一般放置
在Windows所在驱动器的\ Program Files\ Microsoft Shared\ MSInfo路径下。
在VB应用程序中,一般在“关于”窗口中对这个实用程序加以调用,虽然其中的
信息无法直接应用,但它增加了程序的专业性。 

  要想成功地调用MSINFO32.EXE,关键在于获取它所在的路径。这一路径无法
直接由Win32 API函数获得,也不存在于Windows的配置文件中,而仅存在于Wind
ows 的注册表中。Office套件在安装时对MSINFO32.EXE进行了注册,可供Office
各部件共同调用,其路径信息保存在注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Mi
crosoft\Shared Tools\MSINFO中,因此,获取路径的问题转化成了对注册表的查
询。 

  Win32 API提供了一系列操纵注册表的函数,这里用到了RegOpenKeyEx()、
RegQueryValueEx()和RegCloseKey()函数,分别用于打开注册表关键字、检
索注册表关键字的值和关闭注册表关键字。如果RegOpenKeyEx()和RegQueryVa
lueEx()返回为0,说明成功地打开了注册表关键字,并且检索到了预定的MSIF
O32.EXE关键字值,最后调用Shell()函数来启动MSINFO32.EXE。 

  VB5的窗体向导提供了标准的调用过程。首先建立一个新项目,然后在“项目
”菜单中选择“删除Form1”,再添加一个窗体,在弹出的对话框中选择“关于对
话框”,这样就产生了一个定制好的标准的“关于”窗体,其中就有对MSINFO32
.EXE的调用,并对运行错误设置了相应的处理。Microsoft对代码做了详尽的注释
,这里就不再赘述了。 

  Visual Basic的企业版提供了Microsoft Developer Network(MSDN)启动工
具箱,安装之后,就可以访问Win32 Software Development Kit(SDK),它为W
in32 API提供了文件说明,可以帮助程序员理解每一个函数、结构和常量的工作
原理。对VB程序员来讲,理解和使用Windows API有一定的难度,它要求程序员对
Windows的工作原理有较为深入的了解,如果掌握好Windows API的使用方法,则
能够极大地扩展Visual Basic语言的功能,使应用程序对系统的控制更加深入、
灵活。 



b VB5.0环境下Internet应用程序的开发  

一.概述 
  Internet有强大的通信功能,如文件传送、远程登录、E-mail、Internet P
hone和Internet Fax等,它使传统的电信产业发生了巨大变化。同时,它是一个
大型信息资源库,所含信息不仅包罗万象,而且日新月异。尤其是WWW(World Wi
de Web)的出现使全球信息联成一体,并使千家万户可以随时共享这一人类伟大的
资源。WWW的大规模兴起源于商业应用的普及和用户界面友好,越来越多的公司企
业利用WWW网页作为商品促销或对客户服务的手段。不难想像,对于任何一位软件
开发爱好者来说,学习开发Internet应用程序已经是一件刻不容缓的事情了。众
所周知,使用Microsoft Visual Basic 5.0增强的Internet功能使我们能够在很
短的时间内开发出实用的Internet网络应用程序,本文拟向读者介绍的就是有关
这方面的内容。 

  Visual Basic是Microsoft公司面向Windows程序员的RAD(Rapid Applicatio
n Development)工具,它的一大特点就是隐藏了很多纷繁而令人厌倦的Windows编
程细节,而使开发人员将重点放在应用程序的功能上。当人们谈及Internet 应用
程序的时候,由于类型太多,很难明确它们具体指的是什么,因此选择工具之前
先了解所需要的应用程序类型是很重要的。Visual Basic为Internet的各种开发
工作都提供了专门的技术,下表对Internet的各种用途进行了分类,并列举了完
成各类任务所需的相应的Visual Basic工具。 

   

  表1. 

  Internet任务 Visual Basic工具 

  计算机间的直接通信 WinSock控件(MSWINSCK.OCX) 

  文件传输 Internet Transfer控件(MSINET.OCX) 

  Web浏览 WebBrowser控件(SHDOCVW.DLL) 

  在Microsoft Internet Explorer中运行的应用程序的开发 ActiveX文档 

  使用 Internet安装程序发布应用程序 Setup Wizard 

  用于超文本标记语言页面的组件开发 ActiveX控件 

  数据库应用程序 ActiveX文档 

   具有数据控件或使用ADODB对象的ASP 

   从服务器到客户机的事务/数据传输ASP 

   

  另一方面,随着WWW技术日新月异的发展,利用WWW技术构造企业内部网即In
tranet,已经成为人们的一种共识,甚至Intranet应用程序的数量很可能已经超
出了Internet应用程序,而本文描述的每项Internet任务同样也都适用于Intran
et应用程序。 

  以下将通过实例分别讲述使用Visual Basic 5.0完成以下任务:①TCP(UDP)
/IP编程;②创建Internet Explorer中运行的应用程序;③创建FTP浏览器。 

   

  二.TCP(UDP)/IP编程技术 

  TCP/IP协议是一种标准的企业网络协议,它也是Internet网最重要的网络互
联协议,Microsoft Visual Basic 5.0的WinSock控件提供用于Internet的传输控
制协议(TCP)和用户数据包网络协议(UDP)的底层访问,因而可以方便地用于
创建通话应用程序,实现两台或多台联网计算机间的直接数据传输。下面介绍利
用WinSock控件进行TCP/IP编程的主要步骤。 

  2.1 确定应用程序类型 

  使用TCP协议的应用程序,首先必须确定它是服务器端的还是客户端的。如果
要创建一个服务器端的,就必须知道服务器计算机名或者IP地址(RemoteHost属
性),还要知道进行“侦听”的端口(RemotePort属性),然后调用Connect方法
。如果创建客户端应用程序,就应设置一个收听端口(LocalPort属性)并调用L
isten方法。当客户计算机需要连接时就会发生ConnectionRequest事件。为了完
成连接,可调用ConnectionRequest事件内的Accept方法。建立连接后,任何一方
计算机都可以收发数据。为了发送数据,需调用SendData方法。当接收数据时会
发生DataArrival事件。调用DataArrival事件内的GetData方法就可获取数据。 


  2.2 创建一个TCP服务器(Socket服务器) 

  1)创建新项目。 

  在File菜单中单击New Project,打开New Project对话框,然后双击Standa
rd EXE图标,即建立一个新项目,并进入开发环境。 

  2)将缺省窗体的名称改为frmServer。 

  将一个Winsock控件拖到窗体上,并将该控件的名字改为tcpServer。请注意
其中的Protocol属性应为sckTCPProtocol。在窗体上添加两个TextBox控件。将第
一个命名为txtSendData,第二个命名为txtOutput(如图2.1所示)。 

   

  (图2.1) 

   

  3)为窗体添加如下的代码。 

  Private Sub Form_Load() 

  '将LocalPort属性设置为整数后调用Listen方法。 

  tcpServer.LocalPort = 2000 

  tcpServer.Listen 

  End Sub 

  要创建服务器,首先设定一个服务器端口号,并开始侦听是否有客户请求连
接。程序中,LocalPort属性为服务器端口号,最好大于1000,以避免冲突。另外
,对于众所周知的端口号,我们称之为周知口,例如:端口80专用于Web服务。用
Listen方法开始侦听。 

  Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long) 


  '检查控件的State属性是否为关闭的。 

  '如果不是,在接受新的连接之前先关闭此连接。 

  If tcpServer.State <> sckClosed Then tcpServer.Close 

  '接受具有requestID参数的连接。 

  tcpServer.Accept requestID 

  End Sub 

  当客户连接到本服务器时,产生ConnectRequest事件,在事件中接收客户的
请求。 

  程序中的requestID参数表示客户请求连接的ID号,Accept方法接收一个请求
连接。 

  Private Sub txtSendData_Change() 

  '名为 txtSendData 的 TextBox 控件中包含要发送的数据。用户往文本框中
 

  '键入数据时,使用 SendData 方法发送输入的字符串。 

  tcpServer.SendData txtSendData.Text 

  End Sub 

  当我们需要向客户发送数据时,只需要调用SendData方法。 

  程序中使用SendData方法发送数据。 

  Private Sub tcpServer_DataArrival (ByVal bytesTotal As Long) 

  '为进入的数据声明一个变量。 

  '调用GetData方法,并将数据赋予名为txtOutput的TextBox的Text属性。 


  Dim strData As String 

  tcpServer.GetData strData 

  txtOutput.Text = strData 

  End Sub 

  当客户向本服务器发送的数据到达后,产生DataArrival事件,在事件中接收
数据。 

  程序中的bytesTotal参数表示收到数据的总数,GetData方法接收数据。 

  Private Sub tcpServer_close(Index as Integer) 

  tcpServer.Close 

  tcpServer.Listen 

  End Sub 

  当客户关闭连接时,服务器会产生Close事件。在事件中关闭当前连接,重新
开始侦听。其中使用Close方法关闭连接。当然服务器也可以主动调用Close方法
关闭连接,例如在窗体关闭时关闭连接。 

  Sub frmServer_UnLoad(Cancel As Integer) 

  tcpServer.Close 

  End Sub 

  通过上面的步骤我们创建了一个简单的服务器端应用程序。为了使它能够工
作,还必须为它创建一个客户端的应用程序。 

   

  2.3 创建一个 TCP客户端(Socket客户) 

  1)在项目中添加一个新的窗体,将其命名为frmClient。在窗体中添加一个
Winsock控件,并将其命名为tcpClient。在frmClient中添加两个TextBox控件,
将第一个命名为txtSend,第二个命名为txtOutput。在窗体上放一个CommandBut
ton控件,并将其命名为cmdConnect。 

  2)将CommandButton控件的标题改为“连接”。 

  3)在窗体中添加如下的代码。 

  Private Sub Form_Load() 

  'Winsock控件名字为tcpClient。 

  '注意:要指定远程主机,可以使用IP地址(例如:“121.111.1.1”), 


  '也可以使用计算机的别名,如下所示: 

  tcpClient.RemoteHost = "HostServer1" 

   tcpClient.RemotePort = 2000 

  End Sub 

  要创建客户连接服务器,首先要设置服务器主机名,如IP地址、域名或计算
机名等,然后设定服务端口号,最后连接到服务器上。在程序中: 

  RemoteHost属性表示服务器主机名; 

  RemotePort属性表示服务器端口号。 

  Private Sub cmdConnect_Click() 

  '调用Connect方法,初始化连接。 

   tcpClient.Connect 

  End Sub 

  Connect方法连接到服务器; 

   

  Private Sub txtSendData_Change() 

   tcpClient.SendData txtSend.Text 

  End Sub 

   

  Private Sub tcpClient_DataArrival (ByVal bytesTotal As Long) 

   Dim strData As String 

   tcpClient.GetData strData 

   txtOutput.Text = strData 

  End Sub 

   

  Private Sub tcpClient_Close(Index As Integer) 

  tcpClient.Close 

  End Sub 

   

  至此,我们创建了一个简单的客户/服务器模式的应用程序。我们可以将两者
都运行起来:运行项目,然后单击“连接”。在两个窗体之一的txtSendData文本
框中键入文本,可以看到同样的文字将出现在另一个窗体的txtOutput文本框中(
如图2.2所示)。 

  图2.2 

  2.4 创建多客户服务器,接受多个连接请求 

  上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一
个控件也可以同时接受多个连接请求。利用这种方法,不再需要关闭连接,而只
需创建新的控件实例(通过设置其索引属性),然后,在新的实例上调用Accept
方法。 

  下面的代码假定名字为sckServer的窗体上有一个Winsock控件,它的Index属
性被设置为0;控件是控件数组的一部分。在声明部分,声明了一个模块级的变量
intMax。在窗体的Load事件中,intMax被设置为0,数组中第一个控件的LocalPo
rt属性被设置为2000。然后调用控件的Listen方法,使之成为“侦听”控件。在
连接请求到达时,代码将检测Index是否为0(“侦听”控件的值)。如果为0,侦
听控件将增加intMax的值,并使用该号码来创建新的控件实例。然后使用新的控
件实例接受连接请求。 

  Private intMax As Long 

  Private Sub Form_Load() 

   intMax = 0 

   sckServer(0).LocalPort = 2000 

   sckServer(0).Listen 

  End Sub 

  设定端口号后开始侦听。 

   

  Private Sub sckServer_ConnectionRequest (Index As Integer, ByVal 
requestID As Long) 

   If Index = 0 Then 

   intMax = intMax + 1 

   Load sckServer(intMax) 

   sckServer(intMax).LocalPort = 0 

   sckServer(intMax).Accept requestID 

   Load txtData(intMax) 

   End If 

  End Sub 

  在ConnectionRequest事件中,首先加载一个Socket控件,然后再用它来接收
连接。 

   

  2.5 测试开发中应该注意的问题 

  1)协议的设置。 

  当WinSock控件与远程计算机建立连接时,亦可通过用户数据包协议(UDP)
进行数据交换。在使用WinSock控件时,首先需要考虑使用什么协议。TCP应用程
序应注意选择TCP协议。可按如下方式设置应用程序使用的协议:在“属性”窗口
中单击“协议”,然后选择sckTCPProtocol或者sckUDPProtocol。也可以使用程
序代码来设置Protocol属性,如下所示: 

  Winsock1.Protocol = sckTCPProtocol开发TCP应用程序应注意选择TCP协议
。 

  2)注意确定“计算机的名字”。 

  计算机的名字用如下方式查找: 

  ①在计算机的“任务栏”上,单击“开始”。 

  ②在“设置”项中,单击“控制面板”。 

  ③ 双击“网络”图标。 

  ④ 单击“标识”选项卡。 

  ⑤ 在“计算机名称”框中可以找到计算机的名称。 

  上面找到的计算机名称可以作为RemoteHost属性的值。应用这一技术,我方
便地完成了某企业信息管理系统,成功地实现了企业内部信息流的处理。虽然目
前已有WWW浏览器、FTP等Internet互联网的应用工具,可以下载网上的信息,或
实现网上工作站间的数据与文件的传输,但是用Windows Sockets则可方便地在用
户自己设计的Windwos应用程序中通过Internet互联网传输数据,由于互联网的传
输速度可以高达数十兆到数百兆比特每秒,因此,除了可以传递一般的文字、图
形、声音等数据文件外,还可以用来传递实时的图像数据。 

   

  三.创建Internet Explorer中运行的应用程序 

  3.1 概述 

  Visual Basic 5.0版本是直接针对Internet的(也有人称是针对ActiveX的)
,Microsoft目前正在加紧开发用于WWW的Visual Basic(估计Visual Basic 6.0必
将具有这一功能)。Visual Basic包括一个称为用户文档的新容器类型。用户文档
构成了Visual Basic Document(也称ActiveX Document)文档的基础,并且生成
的文档能够使用Microsoft Internet Explorer 3.0以上版本在Internet上浏览(
见图3.1)。利用这一功能我们可以方便地创建动态Web页面。必须指出的是:使
用Visual Basic创建的AcitveX Document与其他ActiveX Document略有不同。Vi
sul Basic AcitveX Document与Visual Basic窗体大致相同,能在ActiveX Docu
ment容器中使用,但我们不能像运行独立应用程序那样运行它们。用户文档与窗
体非常相似,可以包括控件、显示消息框、处理数据以及调用其他组件。用户文
档与窗体的区别主要表现在:⑴应用程序中的其他部分无法得到用户文档中的数
据,不能从文档外部引用用户文档中的属性值。⑵给予用户文档的应用程序需要
Internet Explorer来运行,无法直接从Visual Basic中调试它们。⑶编译过的应
用程序必须从HTM文件启动,它在显示VBD文件之前装入应用程序的代码组件。如
果没?
姓飧鯤TM文件,就不能启动编译过的EXE文件或从Internet Explorer中查看VBD文
件。 

  3.2 ActiveX 文档对象的重要属性 

  在讲述创建ActiveX 文档的具体方法之前,我们先研究一下ActiveX 文档对
象的重要属性。每个用户文档包含一个内置的Hyperlink对象,可用它来进入URL
s和访问Internet Explorer的文档高速缓存。NavigateTo方法大致等价于窗体的
Show方法。 

  事件 Show:当浏览器显示文档时发生; 

   Hide:当浏览器离开文档时发生; 

  属性 HyperLink:用于导航对象; 

   HyperLink对象有三个重要方法: 

   GoBack:前一页面; 

   GoFoward:后一页面; 

   Navigateto:导航; 

  例如HyperLink.Navigateto "http:/www.pccomputing.com"可以导航至《电
子与电脑》杂志的主页。 

  3.3 用Visual Basic创建ActiveX Document的具体步骤 

  我们将开发具有如下功能的应用程序:创建两个ActiveX文档页面,第一个要
求访问者输入密码,按动按钮后,若密码正确则进入第二页面;第二页面可以导
航至中国教育与科研计算机网的主服务器。 

  1)在File菜单中单击New Project来打开一个New Project对话框,然后双击
ActiveX Document exe图标,即可建立一个新项目并进入开发环境。 

  2)在“用户文档”的第一个UserDocument上添加两个Label控件、一个Text
Box和一个CommandButton(如图3.1所示)。 

  (图3.1)。 

  添加如下代码: 

  Private Sub Command1_Click() 

  '核对Text1的文本,如果正确,则转至第二个文档页面。 

  If Text1.Text = "690909" Then 

  Hyperlink.NavigateTo "d:\ActiveX文档\UserDocument2.vbd" 

  End If 

  End Sub 

  3)从菜单“项目”中选择“添加用户文档”,在工程项目中添加第二个Use
rDocument,然后在UserDocument2上添加一个CommandButton(如图3.2所示)。
 

  (图3.2) 

  添加如下的代码: 

  Private Sub Command1_Click() 

  '按动按钮,导航至《电子与电脑》杂志主页。 

  Hyperlink.NavigateTo "http:///www.pccomputing.com" 

  End Sub 

  4)编译文档。 

  5)使用Internet Explorer浏览器测试文档。 

  四.创建FTP浏览器 

  4.1 概述 

  FTP是Internet网上最早使用的文件传输程序。FTP的具体含义是文件传输协
议(File Transfer Protocol),它是由支持Internet文件传输的各种规程所组
成的集合。FTP的作用是使Internet用户能够将文件从一台计算机拷贝到另一台计
算机,为实现Internet资源共享提供有力的保障。它不同于NFS(Network File S
ystem)和Netbios协议,一旦你要访问另一台计算机中的文件,任何时刻都要运行
FTP,而且你只能拷贝文件到自己的机器中时来使用它。FTP是一种客户机/服务器
结构,既需要客户机软件,又需要服务器软件。FTP客户机程序在用户计算机上执
行,服务器程序在宿主计算机上执行。用户启动FTP客户机程序,通过输入户名和
口令同远程主机上的FTP服务器建立连接,一旦成功,在Internet上用户计算机和
宿主计算机之间就建立起一条命令链路(控制链路)。 

  4.2 用Visual Basic 5.0创建FTP浏览器的步骤 

  1) 我们将开发具有如下功能的应用程序:使用两个文本框和一个Internet
 Transfer控件。可在“地址”文本框中输入FTP服务器的URL(Uniform Resourc
e Locator),然后从内容文本框中选择一个文件或目录。如果选择目录,则应用
程序就会显示该目录。如果选择文件,则浏览器会将文件存于Windows Temp目录
中。当用户按回车键时,“地址”文本框会通过设置Internet Transfer控件的U
RL属性并调用Execute方法来执行请求。当请求一个特定文件时,OpenURL方法实
现相同的动作。然而,当你使用OpenURL方法返回目录的内容时,会返回指明目录
内容的HTML源代码。 

  2)在File菜单中单击New Project,以便打开New Project对话框,然后双击
“普通exe”图标,即建立一个新项目,并进入开发环境。 

  3)在窗体上添加一个Label控件、一个TextBox和一个ListBox(如图4.1所示
)。 

  图4.1 

  4)添加如下代码: 

  Private Sub Text1_Click(KeyAscii As Integer) 

  If KeyAscii=Asc(vbCr) Then 

  KeyAscii=0 

  Text1.SelStart=0 

  Text1.SelLength=Len(Text1) 

  On Error goTo errOpenURL 

  InetBrowse.URL=Text1.Text 

  InetBrowse.Execute, "Dir" 

  Caption=inetBrowse.URL 

  End If 

  Exit Sub 

   ErrOpenURL: 

   Select Case Err.Number 

   Case icBadUrl 

   MsgBox"地址错误,请重新出入!" 

   Case icConnectFailed,icConnectionAborted,icCannotConnect 

   MsgBox"无法连入网络!" 

   Case icInetTimeout 

   MsgBox"连接超时!" 

   Case icExecuting 

   InetBrowse.Cancel 

  If inetBrowse.StillExecuting Then 

   Caption="不能取消请求!" 

   Else 

  Resume 

  End If 

  End Select 

  End Sub 

  当你提交一个请求时,设置错误陷阱很重要,尤其是icExecuting错误。Int
ernet Transfer控件采用异步方式处理所有请求。然而,在同一时间仅能处理一
个请求。如果你取消正在进行的请求,那么在重新开始前一定要检查StillExecu
ting属性。有些请求不能被取消,并且简单地使用Resume语句会导致死循环。 


  Private Sub List1_DblClick) 

  If List1.SelLength Then 

   If Right(List1.SelText1,1)="/" Then 

   Text1=Text1 & "/" Left(Text1.SelText,Text1.SelLength-1) 

  On Error goTo errBRowse 

  MsDir=Right(Text1.Len(Text1)-Len(inetBrowse.URL) 

  InetBrowse.Execute,"Dir"&msDir&"/*" 

  Else 

  MsDir=Right(Text1.Len(Text1)-Len(inetBrowse.URL))&"/"&""&msTempDir
&List1.SelText 

  End If 

  End If 

  Exit Sub 

  ErrBrowse: 

  If Err=icExecuting Then 

   inetBrowse.Cancel 

   If inetBrowse.StillExecuting Then 

   MsgBox"不能取消请求!" 

  Else 

  Resume 

  End If 

  Else 

  Debug.Print Err&""&Err.Description 

  End If 

  End Sub 

   FTP命令用于在本地主机和远程主机间或两远程主机间传送文件。为了确保
所传送的文件具有唯一的文件名,可使用一些选项来管理文件名,以便于适应接
收主机的需要。用户能通过使用“anonymous”登录进行公共文件访问。 

   Internet Transfer控件的Books Online文档展示用于创建FTP浏览器的程序
片段,这里就不再详细叙述了。 

Wendery 推荐
===================================================================
欢迎投稿  [email protected] 
主    页  goodvbhome.yeah.net
===================================================================

请订阅:
http://server.com/WebApps/mail-list-subscribe.cgi?id=16852


--
网站主页地址:http://home.hn.cninfo.net/home/msnet
网易上的主页地址:http://www4.netease.com/~aaaaaaaaa
本网站主页镜像地址:http://goodvbhome.yeah.net

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.47.190]

[关闭][返回]