用MODEM撥號上網,仍是多數個人網友選擇上網的方式.如果能在我們的應用程式中啟動撥號連接(如IE瀏覽器程式中的自動撥號功能),無疑將會方便我們的軟體用戶(不用再切換應用程序,運行撥號網路),提高我們的軟體的友好性從而提高軟體的競爭力.
在WIN9X下,如果安裝了撥號網絡,則在WINDOWS系統的系統目錄System下將有兩個撥號網路管理程式庫RasApi32.DLL和RasApi16.DLL,我們可利用其中的函數來建立、修改撥號連接,並利用指定的撥接連線進行撥接上網。
一、新建撥接連接
當WIN9X系統中已經建立了撥號連接,則可利用現成的撥號連接。如果沒有撥號連接,則需要新建一個撥號連接。 RasAPI中提供了對應的函數,其函數名為RasCreatePhonebookEntryA,函數原型為:
function RasCreatePhonebookEntryA( hwnd : THandle;lpszPhonebook: pchar ) : DWord;
stdcall; { 位於interface部分}
function RasCreatePhonebookEntryA ; external 'Rasapi32.dll';{ 位於implementation部分}
參數:
hwnd(THandle):新撥號連線視窗的父視窗的句柄,可以為TForm的Handle,為NIL表;Windows桌面(DeskTop)
lpszPhonebook(pchar):電話本名稱,在Win9X下無作用,可設為空字串
函數傳回值:
0表示執行成功;否則為錯誤.
下面是一個新建撥號連線的例子.
{ 新撥接連線}
PRocedure TForm1.Button1Click(Sender: TObject);
var
dwResult : DWORD;
begin
//在目前視窗中新撥號連接
dwResult := RasCreatePhonebookEntryA( handle, '' );
if dwResult = 0 then
memo1.lines.add('新撥號連線成功!')
else
memo1.lines.add('新撥號連線失敗!')
end;
二、修改指定撥號連線的屬性
若使用者需要修改撥號連線的屬性如電話號碼、國家及區號、連線方式、伺服器類型等,可以用RasAPI函數來實現,其函數名稱為RasEditPhonebookEntryA,函數原型為:
function RasEditPhonebookEntryA( hwnd : THandle; lpszPhonebook: pchar;
lpszEntryName: pchar ) : DWORD;stdcall; { 位於interface部分}
function RasEditPhonebookEntryA; external 'Rasapi32.dll';{ 位於implementation部分}
參數:
hwnd(THandle):新撥號連線視窗的父視窗的句柄,可以為TForm的Handle,為NIL表示
Windows桌面(DeskTop)
lpszPhonebook(pchar):電話本名稱,在Win9X下無作用,可設為空字串
lpszEntryName:( pchar):要修改的撥號連線的名稱,如'163'、'169'等
函數傳回值:
0表示執行成功;否則為錯誤.
下面是一個修改指定撥號連線屬性的例子.
{ 修改指定撥號連線屬性}
procedure TForm1.Button2Click(Sender: TObject);
var
dwResult : DWORD;
strDialName : string;
begin
strDialName := '163';//撥號連線的名稱設為163
//在目前視窗中指定修改撥號連線的屬性
dwResult := RasEditPhonebookEntryA( handle, '', PChar( strDialName ) );
if dwResult = 0 then
memo1.lines.add('修改撥號連線' + strDialName + '成功!')
else
memo1.lines.add('修改撥號連線' + strDialName + '失敗!')
end;
三、取得目前系統中可用的撥號連線名稱
為了讓使用者選擇使用撥接連線進行撥號,我們需要取得系統中已建立的撥號連線的名稱。在建立了撥接連線後,WIN9X將撥接連線的名稱和屬性寫在了登錄中,我們可以從登錄中取得目前系統中可用的撥接連線名稱及在Internet Explorer中設定的預設連線名稱。
在註冊表的HKEY_USERS.DefaultRemoteaccessAddresses下,列出了已經在撥號網路中建立了的撥號連接的名稱及其屬性設置,其中各項目的名稱即為可用的撥號連接的名稱;各項目的值即為各撥號連線的屬性設定.我們只要讀出各項目的名稱即可取得目前系統中可用的撥號連線名稱.
如果在Internet Explorer中設定了預設連接名稱(查看=》Internet選項=》連接=》連接=》設定=》使用以下撥號網路連接),則在註冊表的HKEY_USERS.DefaultRemoteAccess下,有一個字串類型的鍵值,鍵值名稱InternetProfile,其值即為Internet Explorer中設定的預設連線名稱。
以下是一個取得目前系統中可用的撥號連線名稱的範例.
{ 注意在Uses中增加Registry單元,用於操作註冊表}
{ 取得目前系統中可用的撥號連線名稱}
procedure TForm1.Button3Click(Sender: TObject);
var
registryTemp : TRegistry;
stringsTemp : TStringlist;
intIndex : integer;
begin
registryTemp := TRegistry.Create;
stringsTemp := TStringlist.Create;
with registryTemp do
begin
RootKey := HKEY_USERS;//根鍵設定為HKEY_USERS
//如果存在子鍵.DefaultRemoteAccessAddresses
if OpenKey('.DefaultRemoteAccessAddresses',false) then
GetValueNames( stringsTemp );//讀出各項目的名稱,即撥號連線名稱
CloseKey;
end;
//目前系統中可用的撥號連接
memo1.lines.add( '******************目前系統中有'+ IntToStr( stringsTemp.count )
+'個可用的撥號連線如下****************');
for intIndex := 0 to stringsTemp.count - 1 do
memo1.lines.add( stringsTemp.strings[ intIndex ] );
//列出Internet Explorer中設定的預設連線名稱
if registryTemp.OpenKey('.DefaultRemoteAccess',false) then
memo1.lines.add( 'Internet Explorer中設定的預設連線名稱為' +
registryTemp.ReadString('InternetProfile') );
//釋放記憶體
registryTemp.free;
stringsTemp.free;
end;
四、用指定的撥號連線撥號
以上的三個工作的目的就是為了撥接上網,現在就來看看如果用指定的撥接連線撥號上網。最好的方法就是呼叫WIN9X的撥接網路服務了,就是執行WIN9X下的現成程式。
在Delphi程式中可以用以下程式碼實現撥號上網:
winexec('rundll32.exe rnaui.dll,RnaDial 163',SW_SHOWNORMAL);
其中字串中的最後一個參數「163」為撥號連線的名稱。
下面是一個用指定的撥接連線撥號上網的例子.
{ 以指定的撥接連線撥號上網}
procedure TForm1.Button4Click(Sender: TObject);
var
strDialName : string;
begin
strDialName := '163';//撥號連線的名稱設為163
memo1.lines.add( '******************用撥號連接'+ strDialName
+'實現撥號上網****************');
winexec( PChar('rundll32.exe rnaui.dll,RnaDial ' + strDialName),SW_SHOWNORMAL);
end;
以上程序在PWIN98+Delphi3.0下調試通過。