delphi實現modem自動撥號

來源:互聯網
上載者:User

如果能在我們的應用程式中啟動撥號  
串連(如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/.Default/RemoteAccess/Addresses下,列出了已經在撥號網路中建立了的  
撥號連線的名稱及其屬性設定,其中各項目的名稱即為可用的撥號連線的名稱;各項目的值即為各撥號  
串連的屬性設定.我們只要讀出各項目的名稱即可擷取當前系統中可用的撥號連線名稱.  
  如果在Internet  Explorer中設定了預設串連名稱(查看=》Internet選項=》串連=》串連=》  
設定=》使用以下撥號網路串連),則在註冊表的HKEY_USERS/.Default/RemoteAccess下,有一個字元  
串類型的索引值,索引值名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  
//如果存在子鍵.Default/RemoteAccess/Addresses  
if  OpenKey('.Default/RemoteAccess/Addresses',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('.Default/RemoteAccess',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);

 

========================================================================

撥號完了,擷取新的ip地址了。你想幹什嗎?哈哈。。。自由發揮吧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.