【 tulaoshi.com - 编程语言 】
VisualBasic6.0(以下简称VB6)以其强大的功能为广大软件开发人员所喜爱,被用来开发各种应用程序。随着Internet的迅猛发展,VB6在网络方面的应用开发也越来越多。本文介绍笔者在实际编程开发中总结的5个技巧,希望能为进行网络开发的朋友们提供一点参考。
连通检测
许多应用程序常常需要在程序中直接进行联网操作,以便进行一些必要的处理(如在线注册和在线帮助等),这就要求我们在程序中建立某些连接。很多软件在不知用户是否联网的情况下就启动浏览器查找网址,结果只能查出一错误网页,既浪费用户时间又没有任何效果。如果应用程序在查找网页之前能自动判断用户是否已经联网,就会节约许多时间,提高程序运行效率。
下面是实现网络连通检测的VB6代码:
PrivateSubForm_Load()
IfIsConnected=TRUEThen
MsgBox(“您已经连通了Internet!”)
EndIf
IfIsConnected=FALSEThen
MsgBox(“您还没有连通Internet!”)
EndIf
EndSub
OptionExplicit
/*有关的API声明和定义*/
PublicDeclareFunctionRasEnumConnectionsLib“RasApi32.dll”Alias“RasEnumConnectionsA”(lpRasConAsAny,lpcbAsLong,lpcConnectionsAsLong)AsLong
PublicDeclareFunctionRasGetConnectStatusLib“RasApi32.dll”Alias“RasGetConnectStatusA”(ByValhRasConAsLong,lpStatusAsAny)AsLong
/*常数和变量的设定*/
PublicConstRAS95_MaxEntryName=256
PublicConstRAS95_MaxDeviceType=16
PublicConstRAS95_MaxDeviceName=32
PublicTypeRASCONN95
dwSizeAsLong
hRasConAsLong
szEntryName(RAS95_MaxEntryName)AsByte
szDeviceType(RAS95_MaxDeviceType)AsByte
szDeviceName(RAS95_MaxDeviceName)AsByte
EndType
PublicTypeRASCONNSTATUS95
dwSizeAsLong
RasConnStateAsLong
dwErrorAsLong
szDeviceType(RAS95_MaxDeviceType)AsByte
szDeviceName(RAS95_MaxDeviceName)AsByte
EndType
/*函数IsConnected返回连通的状态,如果为True则表示已连通*/
PublicFunctionIsConnected()AsBoolean
DimTRasCon(255)AsRASCONN95
DimlgAsLong
DimlpconAsLong
DimRetValAsLong
DimTstatusAsRASCONNSTATUS95
TRasCon(0).dwSize=412
lg=256*TRasCon(0).dwSize
RetVal=RasEnumConnections(TRasCon(0),lg,lpcon)
IfRetVal0Then
MsgBox“错误”
ExitFunction
EndIf
Tstatus.dwSize=160
RetVal=RasGetConnectStatus(TRasCon(0)
.hRasCon,Tstatus)
IfTstatus.RasConnState=&H2000Then
IsConnected=TRUE
Else
IsConnected=FALSE
EndIf
EndFunction
启动拨号网络中的连接
由于拨号网络不是一个可执行文件,所以要启动拨号网络,需要借助explorer.exe。但若是要启动拨号网络中的某一个连接,则要借助rundll.exe和rnaui.dll两个文件。启动方法如下(假定此连接名称为163):
Shell“rundllrnaui.dll,RnaDial163”,vbNormalFocus
上面假定了连接名称,但在实际编程中我们是不知道连接名称的。在窗体上放置一个命令按钮(cmdCallConnect),在其单击事件中进行连接处理。下面的代码介绍如何取得默认的连接名称并启动它:
OptionExplicit
/*有关的API声明*/
PrivateDeclareFunctionRegOpenKeyExLib“advapi32”Alias“RegOpenKeyExA”(ByValhKeyAsLong,ByVallpSubKeyAsString,ByValulOptionsAsLong,ByValsamDesiredAsLong,phkResultAsLong)AsLong
PrivateDeclareFunctionRegQueryValueExLib“advapi32”Alias“RegQueryValueExA”(ByValhKeyAsLong,ByVallpValueNameAsString,ByVallpReservedAsLong,ByReflpTypeAsLong,ByValszDataAsString,ByReflpcbDataAsLong)AsLong
PrivateDeclareFunctionRegCloseKeyLib“advapi32”(ByValhKeyAsLong)AsLong
/*常数的设定*/
ConstHKEY_CURRENT_USER=&H80000001
ConstERROR_SUCCESS=0
在命令按钮(cmdCallConnect)中加入如下代码:
PrivateSubcmdCallConnect_Click()
/*启动默认拨号连接*/
Shell“rundllrnaui.dll,RnaDial”+GetConnect,vbNormalFocus
EndSub
/*取得连接的函数(GetConnect)*/
PublicFunctionGetConnect()AsString
DimhKeyAsLong
DimSubKeyAsString
/*主键*/
hKey=HKEY_CURRENT_USER
/*子键*/
SubKey=“RemoteAccess”
/*取得默认连接名*/
GetConnect=GetRegValue(hKey,SubKey,“Default”)
EndFunction
/*取得注册的函数(GetRegValue)*/
PublicFunctionGetRegValue(hKeyAsLong,lpszSubKeyAsString,szKeyAsString)AsVariant
OnErrorGoToErrorRoutineErr:
DimphkResultAsLong
DimlResultAsLong
DimszBufferAsString
DimlBuffSizeAsLong
/*创建缓冲区*/
szBuffer=Space(255)
lBuffSize=Len(szBuffer)
/*打开注册键*/
RegOpenKeyExhKey,lpszSubKey,0,1,phkResult
/*取得查询结果*/
lResult=RegQueryValueEx(phkResult,szKey,0,0,szBuffer,lBuffSize)
/*关闭注册键*/
RegCloseKeyphkResult
/*返回结果*/
IflResult=ERROR_SUCCESSThen
GetRegValue=Left(szBuffer,lBuffSize-1)
Else
GetRegValue=“”
EndIf
ExitFunction
/*意外处理*/
ErrorRoutineErr:
GetRegValue=“”
EndFunction
设计E-mail的接收部分
在VB6菜单上点击“工程/部件...”,弹出“部件”对话框,在对话框的控件卡中选中MicrosoftMAPIControls6.0控件,点击“确定”按钮后,工具箱上增加了MAPIMessage和MAPISession两个图标。
在Form上加入一个MAPIMessage控件,取名为MAPIMessage1;再加入一个MAPISession控件,取名为MAPISession1;再加入三个TextBox控件,分别取名为Subject、Content和Indexno,将它们的Caption分别改为邮件标题、邮件内容和邮件索引号;在TextBox前各加入一个Label控件,将Caption分别改为标题、内容和索引号。
将MAPIMessage1的各项属性设置如下:
●DownLoadMail=TRUE;
●LogonUI=TRUE;
●NewSession=FALSE;
●UserName=“接收Email”。
在Form上加入一个按钮(Getmail),将其Caption改为取邮件。
在Getmail_Click()事件中加入以下程序代码,程序的功能是使我们接收Email。
MAPIMessage1.Fetch
Form1.Caption=MAPIMessage1.MsgCount
MAPIMessage1.MsgIndex=CINT(Indexno.text)
Subject.Text=MAPIMessage1.MsgNoteText
Content.Text=MAPIMessage1.MsgSubject
其中Fetch命令用来将信件抓到系统存储器的inbuffer中。我们将信件抓回来后,可以通过MsgCount属性知道信件数量,接着可以用MsgIndex设置要看哪一封信件的内容、标题等。
设计E-mail的发送部分
1.参数设置
进入Exchange系统,选择新增设置文件后屏幕上会显示所需要的信息服务,选择InternetMail。
把设置文件的名称设为test。屏幕会显示两个选项,您可以选择以Modem方式或以Network方式连接。笔者所用的是Modem方式;假若您是使Internet专线,就要选择Network方式。
选择Modem方式后,Exchange会要求我们输入邮件服务器的IP地址。接着将TransformMessage的模式设置为Automatic,这样当我们连接到邮件服务器时,新的信息会自动下载到本地端。接下来,将您所使用的Email地址、全名、口令和下载路径等一一设置好。
2.程序设计
在Form上加入一个MAPIMessage控件,取名为MAPIMessage1;加入一个MAPISession控件,取名为MAPISession1;并加入三个TextBox控件,取名为Subject、Content和Addr。并在三个TextBox前各加入一个Label,将Caption分别改为标题、内容和地址。
将MAPIMessage1的各项属性设置如下:
●DownLoadMail=TRUE;
●LogonUI=TRUE;
●NewSession=FALSE;
●UserName=“发送Email”。
这里将DownLoadMail设置为TRUE,当程序和邮件服务器第一次连接时,会将新的邮件下载到本地端。将LogonUI设置为TRUE,则当您程序中Logon名称输入错误时,系统会显示一个MessageBox来让您输入正确的名称。
由于这个程序仅使用一个Session,所以可将NewSession设置成FALSE。如果您有许多Session要建立的话,则将它设置成TRUE。UserName中所填的,是我们在Exchange中所新增的设置文件名称,如果没有填内容的话,系统将会显示一些MessageBox请您输入文件。
在Form上加入三个按钮,Logon、Logoff和Send,并分别将它们的Caption改为登录、离网和发送。
在Logon_Click()事件中加入以下程序代码,程序的功能是使我们登录到邮件服务器:
MAPISession1.SignOn
MAPIMessage1.SessionID=MAPISession1.SessionID
sgBox“YourIDis”+Str
(MAPISession1.SessionID)
其中MAPISession1.SignOn是作登录的动作。在登录时,因为已经将MAPIMessage1控件的DownLoadMail属性设置为TRUE,所以可以在屏幕上看到MessageBox,显示系统正在下载邮件。登录成功后,系统会传回一个SessionID,将该ID填入MAPIMessage1的SessionID中,这样就可以利用该Session来传送Email,同时用MessageBox通知用户发送成功。
在Logoff_Click()事件中加入以下程序代码,程序的功能是使我们离开邮件服务器:
MAPIS1.SignOff
在Send_Click()事件中加入以下程序代码,程序的功能是使我们发送Email:
MAPIMessage1.Compose
MAPIMessage1.RecipDisplayName=Addr.text
MAPIMessage1.AddressResolveUI=TRUE
MAPIMessage1.MsgSubject=Subject.text
MAPIMessage1.MsgNoteText=Content.text
MAPIMessage1.Send
MsgBox“您发送成功啦!”
其中Compose命令的主要目的是使您可以改变RecipDisplayName的内容,将所需传送的Email地址、主题和文章内容分别填入RecipDisplayName、MsgSubject和MsgNoteText,接着用Send命令发送出去。
访问Internet并调用Explorer
1.实现方法和控件介绍
首先在VB6菜单上点击“工程/部件...”,弹出“部件”对话框,在对话框的控件卡中选中MicrosoftInternetControls控件,点击“确定”按钮后工具箱上增加一个WebBrowser图标,将它加到Form中。
该控件有以下几个重要的方法和事件:
●GoHome:装入IE设定的起始页;
●Navigate:装入页面,如Object.Navigateurl,其中url为URL地址,如http://www.microsoft.com;
●GoBack:返回上一个页面;
●GoForward:进入下一个页面;
●Stop:停止载入页面;
●BeforeNavigateEvent:在每次装入页面前调用该事件;
●StatusTextChangeEvent:每次浏览器的操作状态改变时调用该事件。
2.具体的访问方法
将WebBrowser图标添加到Form中。并在Form上添加4个命令按钮,Name属性分别为:GoButton、BackButton、ForwardButton和StopButton,通过这4个命令按钮可以实现对浏览器的操作。在Form上添加一个TextBox控件,用来输入和显示当前的页面地址。在Form上添加一个Label控件,用来显示当前浏览器操作状态。
/*载入Form*/
PrivateSubForm_Load()
/*程序装入后进入IE设定的起始页*/
WebBrowser1.GoHome
EndSub
/*改变Form尺寸*/
PrivateSubForm_Resize()
/*改变窗口大小后同时改变控件的大小*/
WebBrowser1.Width=Form1.ScaleWidth
WebBrowser1.Height=Form1.ScaleHeight-900
Label1.Width=Form1.ScaleWidth
Label1.Top=Form1.ScaleHeight-300
EndSub
PrivateSubBackButton_Click()
/*返回上一个页面*/
WebBrowser1.GoBack
EndSub
PrivateSubForwardButton_Click()
/*进入下一个页面*/
WebBrowser1.GoForward
EndSub
PrivateSubGoButton_Click()
/*浏览输入的页面*/
WebBrowser1.Navigate(Text1.Text)
EndSub
PrivateSubStopButton_Click()
/*停止浏览*/
WebBrowser1.Stop
EndSub
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
/*输入地址后进行浏览*/
IfKeyAscii=13Then
WebBrowser1.Navigate(Text1.Text)
EndIf
EndSub
PrivateSubWebBrowser1_BeforeNavigate(ByValURLAsString,ByValFlagsAsLong,ByValTargetFrameNameAsString,PostDataAsVariant,ByValHeadersAsString,CancelAsBoolean)
/*将当前显示的页面的URL地址显示在Text1上*/Text1.Text=URL
EndSub
PrivateSubWebBrowser1_StatusTextChange(ByValTextAsString)
/*Label1显示当前页面装入情况*/
Label1.Caption=Text
EndSub->