?? wzjh48.htm
字號:
<html><head><meta NAME="GENERATOR" Content="Microsoft FrontPage 3.0"><meta HTTP-EQUIV="Content-Type" content="text/html; charset=gb2312"><meta HTTP-EQUIV="Expires" CONTENT="0"><title>在DELPHI程序管理撥號網絡</title><style type="text/css"><!--BODY { BACKGROUND: white; FONT-FAMILY: 宋體; FONT-SIZE: 9pt}.font1 { FONT-FAMILY: "宋體"; FONT-SIZE: 11pt; line-height: 130%}A { COLOR: #000080; FONT-FAMILY: 宋體, "Arial"; FONT-SIZE: 9pt; TEXT-DECORATION: none; TEXT-TRANSFORM: none}A:hover { COLOR: red; FONT-SIZE: 9pt}TD { FONT-FAMILY: 宋體, "Arial", "Times New Roman"; line-height: 150%; FONT-SIZE: 9pt}--></style><body><table width=100% cellspacing='0' cellpadding='0' align='center' border='0'> <tr bgcolor="#FFFFFF"> <td class='tt2' > <table border="0" cellpadding="2" cellspacing="1" width="100%" align="center"> <tr bgcolor="#FFFFFF"> <td align="centr" valign="top" class="font1"><font color="#000000"> <br> 在DELPHI程序管理撥號網絡 <br>   作者:王軍發 <br>    <br>    <br>    用MODEM撥號上網,仍是大多數個人網民選擇上網的方式.如果能在我們的應用程序中管理撥號 網絡(如Foxmail、Sygate中的撥號功能),無疑將會方便我們的軟件用戶(不用再切換應用程序, 運行撥號網絡),提高我們的軟件的友好性從而提高軟件的競爭力. <br>    <br>    在WIN9X下,如果安裝了撥號網絡,則在WINDOWS系統的系統目錄System下將有兩個撥號網絡管理 程序庫RasApi32.DLL和RasApi16.DLL,我們可利用其中的函數來獲取和設置撥號連接網絡的信息。在 Delphi幫助文件中,有相關函數的說明。 <br>    <br>    在此,我們要討論的管理項目有: <br>   1、獲取當前系統中可用的撥號連接名稱 <br>    2、新建撥號連接、修改撥號連接的屬性 <br>    3、獲取和設置撥號連接的撥號參數 <br>    4、用指定的撥號連接撥號、掛斷指定的撥號連接 <br>    5、獲取當前活動的連接及其連接狀態零、獲取RasAPI函數執行失敗的錯誤信息 <br>    <br>    RasAPI的調用接口是統一的,但對于不同的Windows版本,許多常量和數據結構的定義是不同的。 如果使用的數據結構與Windows版本不對應,RasAPI函數執行會失敗;另外,其它原因如其它程序也 在使用同一個撥號連接進行撥號等,也會造成RasAPI函數執行失敗.鑒于此原因,我們需要先討論獲 取RasAPI函數執行失敗的錯誤信息的函數。 <br>    當一個RasAPI函數執行結束時,會返回一個結果標識,為0時表示執行成功,否則作為一個錯誤標 識符表示執行失敗的原因。RasAPI函數RasGetErrorString可以根據錯誤標識符返回其錯誤描述信息, <br>   在中文WIN9X下可提供一個中文錯誤信息. <br>    RasGetErrorString的函數原型為: <br>   function RasGetErrorString ( <br>   uErrorValue : UINT;//錯誤標識符 <br>   lpszErrorString : PChar;//錯誤提示信息的緩沖區 <br>   cBufSize : DWORD//錯誤提示信息的緩沖區大小 <br>   ) : DWORD; stdcall; <br>   function RasGetErrorString;external RasApiDll name 'RasGetErrorStringA'; <br>   ( 注:RasApiDll = 'Rasapi32.dll'; ) <br>    <br>    為了方便,我們可以自己編寫一個函數,用于獲取RasAPI函數執行失敗的錯誤信息。在下面的例 <br>   子中,會經常用到該函數。函數代碼如下所示: <br>   { 根據錯誤標識符,獲取RasAPI函數執行失敗的錯誤信息 } <br>   function GetRasError( ErrorID : UINT ) : string; <br>   var <br>   buffer : array[ 0..255 ] of char; <br>   begin <br>   if 0 = RasGetErrorString( ErrorID, buffer, 256 ) then <br>   result := strpas( buffer )//如果能正確返回錯誤信息,則轉化為Pascal字符串 <br>   else//否則返回16進制形式的錯誤代碼 <br>   result := 'GetRasError Failure:ErrorID=' + Format( '%x',[ErrorID] ); <br>   end; <br>    <br>   一、獲取當前系統中可用的撥號連接名稱 <br>    即獲取系統中已建立的撥號連接的名稱,可用來讓用戶選擇使用哪個撥號連接進行撥號. <br>    可以用兩種方法來實現.一種是利用RasAPI函數;另一種是不用RasAPI函數,直接在注冊表中查詢. <br>    <br>    1、不用RasAPI函數,直接在注冊表中查詢 <br>    在注冊表的HKEY_USERS\.Default\RemoteAccess\Addresses下,列出了已經在撥號網絡中建立的撥號連接的名稱及其屬性設置,其中各項目的名稱即為可用的撥號連接的名稱;各項目的值即為各撥號連接的屬性設置,不過是二進制串,筆者還看不懂.由此可見,我們只要讀出各項目的名稱即可獲取當前系統中可用的撥號連接名稱. <br>   var <br>   registryTemp : TRegistry; <br>   stringsTemp : TStringlist; <br>   begin <br>   registryTemp := TRegistry.Create; <br>   stringsTemp := TStringlist.Create; <br>   with registryTemp do <br>   begin <br>   RootKey := HKEY_USERS;//根鍵設置為HKEY_USERS <br>   //如果存在子鍵.Default\RemoteAccess\Addresses <br>   if OpenKey('.Default\RemoteAccess\Addresses',false) then <br>   GetValueNames( stringsTemp );//讀出各項目的名稱,即撥號連接名稱 <br>   end; <br>   combobox1.Items.assign( stringsTemp );//顯示,供選擇 <br>   end; <br>    <br>    2、用RasAPI函數 <br>   RasAPI函數RasEnumEntries可獲取當前系統中可用的撥號連接名稱.其函數原型為 <br>   function RasEnumEntries(reserved : PChar;//保留字段,必須為NIL <br>   lpszPhonebook : PChar;//電話本名稱,在Win9X下無作用,可為空字符串 <br>   lprasentryname : LPRASENTRYNAME;//接收撥號連接名稱的緩沖區,是一個RASENTRYNAME類型數組的指針 <br>   var lpcb : DWORD;//接收撥號連接名稱的緩沖區的大小(Bytes) <br>   var lpcEntries: DWORD//實際獲得的撥號連接名稱的數目 <br>   ) : DWORD; stdcall; <br>   function RasEnumEntries;external RasApiDll name 'RasEnumEntriesA'; <br>    <br>   參數lprasentryname提供了一個RASENTRYNAME類型數組的指針,指向一個接收撥號連接名稱的緩沖區,其中RASENTRYNAME及LPRASENTRYNAME的類型說明如下: <br>    <br>   LPRASENTRYNAME = ^RASENTRYNAME; <br>   RASENTRYNAME = record <br>   dwSize : DWORD;//該結構所占內存的大小(Bytes),一般設置為SizeOf(RASENTRYNAME) <br>   szEntryName : array [ 0..RAS_MaxEntryName ] of char;//撥號連接名稱 <br>   end; <br>    lpcb為緩沖區的大小,一般設置為dwSize的倍數,倍數為可能有的連接的個數. <br>    lpcEntries實際的連接的個數. <br>    <br>    下面是一個應用例子,列出了當前系統中可用的撥號連接名稱. <br>   注意,應在RASENTRYNAME緩沖區的第一個RASENTRYNAME結構中設置dwSize. <br>   const MaxPhoneEntries = 10;//最多的撥號連接數目 <br>   var intIndex : integer; <br>   PhoneEntries : array[ 0..MaxPhoneEntries - 1 ] of RASEntryName; <br>   dwSize, dwEntries, dwResult : DWORD; <br>   begin <br>   //在RASENTRYNAME緩沖區的第一個RASENTRYNAME結構中設置dwSize <br>   PhoneEntries[ 0 ].dwSize := sizeof( RASEntryName ); <br>    <br>   dwSize := MaxPhoneEntries * sizeof( RASEntryName );//為緩沖區的大小 <br>   //調用RasAPI函數,獲取當前系統中可用的撥號連接名稱 <br>   dwResult := RasEnumEntries ( NIL,'',@PhoneEntries[ 0 ],dwSize, dwEntries ); <br>    <br>   if dwResult <> 0 then <br>   begin//RasAPI函數,執行錯誤 <br>   memo1.lines.add('RasEnumEntries錯誤:' + GetRasError( dwResult )); <br>   exit; <br>   end; <br>    <br>   //顯示當前系統中可用的撥號連接名稱 <br>   memo1.lines.add('共有' + inttostr( dwEntries ) + '個RAS連接,如下所示'); <br>   for intIndex := 0 to dwEntries -1 do <br>   memo1.lines.add( strpas( PhoneEntries[ intIndex ].szEntryName ) ); <br>   end; <br>    <br>    3、獲取默認的撥號連接的名稱 <br>    默認的撥號連接,即用戶在瀏覽器中設置的撥號連接,該連接可以認為是用戶最常用撥號連接. <br>    在注冊表的HKEY_USERS\.Default\RemoteAccess位置,有一個字符串名Profile,它對應字符值即為HKEY_USERS\.Default\RemoteAccess\Addresses. <br>    <br>   二、新建撥號連接、修改撥號連接的屬性 <br>    RasAPI函數RasCreatePhonebookEntry、RasEditPhonebookEntry通過調用Win9X的 <br>   新建撥號連接、修改撥號連接的設置界面,允許用戶新建撥號連接、修改撥號連接,具體的設置操作還要由系統來完成. <br>    1、新建撥號連接 <br>    新建撥號連接的RasAPI函數為RasCreatePhonebookEntry,其函數原型為: <br>   function RasCreatePhonebookEntry( <br>   hwnd : THandle; //新建撥號連接窗口的父窗口的句柄,為NIL表示桌面(DeskTop) <br>   lpszPhonebook: pchar//電話本名稱,在Win9X下無作用,可為空字符串 <br>   ) : DWORD;stdcall; <br>   function RasCreatePhonebookEntry;external RasApiDll name 'RasCreatePhonebookEntryA'; <br>    <br>    函數返回值為0表示執行成功;否則為錯誤代碼. <br>    <br>    下面是一個應用例子,允許用戶新建一個撥號連接. <br>   var <br>   dwResult : DWORD; <br>   begin <br>   //在當前窗口中新建撥號連接 <br>   dwResult := RasCreatePhonebookEntry( handle, '' ); <br>   if dwResult = 0 then <br>   memo1.lines.add('新建撥號連接成功!') <br>   else <br>   memo1.lines.add('新建撥號連接失敗:!' + GetRasError( dwResult )) <br>   end; <br>    <br>    2、修改撥號連接的屬性 <br>    修改撥號連接的屬性的RasAPI函數為RasEditPhonebookEntry,其函數原型為: <br>   function RasEditPhonebookEntry( <br>   hwnd : THandle; //新建撥號連接窗口的父窗口的句柄,為NIL表示桌面(DeskTop) <br>   lpszPhonebook: pchar;//電話本名稱,在Win9X下無作用,可為空字符串 <br>   lpszEntryName: pchar//撥號連接的名稱,如'163'、'169'等 <br>   ) : DWORD; stdcall; <br>   function RasEditPhonebookEntry;external RasApiDll name 'RasEditPhonebookEntryA'; <br>    <br>    函數返回值為0表示執行成功;否則為錯誤代碼. <br>    下面是一個應用例子,允許用戶修改指定撥號連接的屬性. <br>   var <br>   dwResult : DWORD; <br>   begin <br>   //在當前窗口中修改撥號連接的屬性 <br>   dwResult := RasEditPhonebookEntry( handle, '', '163' ); <br>   if dwResult = 0 then <br>   memo1.lines.add('修改撥號連接成功!') <br>   else <br>   memo1.lines.add('修改撥號連接失敗:!' + GetRasError( dwResult )) <br>   end; <br>    <br>   三、獲取和設置撥號連接的撥號參數 <br>    用RasAPI函數RasGetEntryDialParams、RasSetEntryDialParams可以直接獲取和設置指定撥號連接的撥號參數,其中包括用戶名稱和用戶密碼! <br>    1、獲取撥號連接的撥號參數 <br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -