delphi实现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/.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地址了。你想干什么?哈哈。。。*发挥吧

上一篇:组策略 从入门到精通 (三) 关于站点之间策略的相互复制和相关设置


下一篇:WPF 属性变更通知类的实现