请问如何控制拨号连接?

redrd 2003-06-03 11:12:43
WIN2000的拨号连接已经设置好,如何在程序里控制拨号,断开等操作?
拨号成功或断开成功如何检测?

有现成的函数可以调用吗?
...全文
43 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hcfymm 2003-07-22
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
String TForm1::GetPhoneBookEntry()
{
//获取系统电话簿
RASENTRYNAME *entries=new RASENTRYNAME;
entries->dwSize=sizeof(RASENTRYNAME);
DWORD numEntries;
DWORD size=entries->dwSize;
DWORD res=fRasEnumEntries(0,0,entries,&size,&numEntries);

if(numEntries==1)
{
String entryName=entries->szEntryName;
ConnectList->Items->Add(entryName);
ConnectList->ItemIndex=0;
delete entries;
return entryName;
}

if(res==ERROR_BUFFER_TOO_SMALL)
{
//分配足够内存用来获取所有的电话簿条目
delete entries;
entries=new RASENTRYNAME[numEntries];
entries[0].dwSize=sizeof(RASENTRYNAME);
res=fRasEnumEntries(0,0,entries,&size,&numEntries);
if (res)
{
char buff[256];
fRasGetErrorString(res,buff,sizeof(buff));
ShowMessage(buff);
}
}

for (int i=0;i<(int)numEntries;i++)
{
ConnectList->Items->Add(entries[i].szEntryName);
}
ConnectList->ItemIndex=0;
String s=Form1->ConnectList->Text;
delete []entries;
return s;
}
//---------------------------------------------------------------------------
void TForm1::CheckRnaApp()
{
//对操作系统进行判断
if (Win32Platform==VER_PLATFORM_WIN32_NT)
{
//只有win9x才有RNAAPP程序调用拨号程序
return;
}
HWND hWnd=FindWindow("RnaEngClass",0);
if (hWnd)
{
//如果系统发现RNAAPP就释放它
PostMessage(hWnd,WM_CLOSE,0,0);
//系统延时2秒
Sleep(2000);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
hRas=0;
hRasInstance=LoadLibrary("RASAPI32.DLL");//动态加载Ras.dll
if (!hRasInstance)
{
ShowMessage("加载程序出错!");
return;
}
//获取动态链接库加载后内存地址
fRasGetErrorString=(pRasGetErrorString)(GetProcAddress(hRasInstance,"RasGetErrorStringA"));
fRasDial=(pRasDial)(GetProcAddress(hRasInstance,"RasDialA"));
fRasEnumConnections=(pRasEnumConnections)(GetProcAddress(hRasInstance,"RasEnumConnectionsA"));
fRasGetConnectStatus=(pRasGetConnectStatus)(GetProcAddress(hRasInstance,"RasGetConnectStatusA"));
fRasEnumEntries=(pRasEnumEntries)(GetProcAddress(hRasInstance,"RasEnumEntriesA"));
fRasHangUp=(pRasHangUp)(GetProcAddress(hRasInstance,"RasHangUpA"));
//对获取后的参数进行校验
if (!fRasGetErrorString ||!fRasDial||!fRasEnumConnections||!fRasGetConnectStatus||!fRasEnumEntries||!fRasHangUp)
{
ShowMessage("调用RAS函数程序出错!");
}
GetPhoneBookEntry();//获取系统电话簿
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
HangUpBtnClick(this);
FreeLibrary(hRasInstance);//释放动态加载的Ras.dll
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ConnectBtnClick(TObject *Sender)
{
//实现拨号连接
String PBEntry=ConnectList->Items->Text.Trim();
//检测电话簿
if(PBEntry=="")
{
ShowMessage("你未选定电话簿,请选择电话簿后再连接互联网!");
return;
}
//检测win9x中运行的RNAAPP
CheckRnaApp();
RASDIALPARAMS params;
params.dwSize=sizeof(params);
strcpy(params.szEntryName,PBEntry.c_str());
strcpy(params.szPhoneNumber,"");
strcpy(params.szCallbackNumber,"");
strcpy(params.szUserName,"");
strcpy(params.szPassword,"");
strcpy(params.szDomain,"*");

DWORD res=fRasDial(0,0,¶ms,1,RasCallback,&hRas);
if (res)
{
char buff[256];
fRasGetErrorString(res,buff,sizeof(buff));
Memo1->Lines->Add(buff);
return;
}
else
{
Memo1->Lines->Add("系统正在拨号,请稍候......");
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::HangUpBtnClick(TObject *Sender)
{
//中断网络连接
if (!hRas)
{
return;
}
Form1->Memo1->Lines->Add("系统正在中断网络连接,请稍候......");
fRasHangUp(hRas);
Sleep(3000);
DWORD res=0;
while (res!=ERROR_INVALID_HANDLE)
{
RASCONNSTATUS status;
status.dwSize=sizeof(status);
res=fRasGetConnectStatus(hRas,&status);
Sleep(0);
}
AlreadyConnected=false;
hRas=0;
Memo1->Lines->Add("网络连接已经断开!");
HangUpBtn->Enabled=false;
ConnectBtn->Enabled=true;
}
hcfymm 2003-07-22
  • 打赏
  • 举报
回复
#include <vcl.h>
#pragma hdrstop
#include "RasDail.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//程序动态加载Ras.dll以保证程序的兼容性
//重新定义RAS API 函数原型
typedef DWORD(_stdcall *pRasGetErrorString)(UINT,LPTSTR,DWORD);
typedef DWORD(_stdcall *pRasDial)(LPRASDIALEXTENSIONS,LPTSTR,LPRASDIALPARAMS,DWORD,LPVOID,LPHRASCONN);
typedef DWORD(_stdcall *pRasEnumConnections)(LPRASCONN,LPDWORD,LPDWORD);
typedef DWORD(_stdcall *pRasGetConnectStatus)(HRASCONN,LPRASCONNSTATUS);
typedef DWORD(_stdcall *pRasEnumEntries)(LPTSTR,LPTSTR,LPRASENTRYNAME,LPDWORD,LPDWORD);
typedef DWORD(_stdcall *pRasHangUp)(HRASCONN);

//定义系统变量指针
pRasGetErrorString fRasGetErrorString;
pRasDial fRasDial;
pRasEnumConnections fRasEnumConnections;
pRasGetConnectStatus fRasGetConnectStatus;
pRasEnumEntries fRasEnumEntries;
pRasHangUp fRasHangUp;
HINSTANCE hRasInstance;

//创建系统回调函数
VOID WINAPI RasCallback(HRASCONN hrasconn,UINT unMsg,RASCONNSTATE rascs,DWORD dwError,DWORD dwExtendedError)
{
String S="";
if (dwError)
{
//回调函数若发生错误,就在Memo1中显示出来
char buff[256];
fRasGetErrorString(dwError,buff,sizeof(buff));
Form1->Memo1->Lines->Add(buff);
return;
}

switch (rascs)
{
case RASCS_PortOpened:
S = "通讯端口已打开,请稍候......"; //"Port Opened";
break;
case RASCS_DeviceConnected:
S ="上网设备已找到,请稍候......"; //"Device Connected";
break;
case RASCS_Authenticate:
S = "系统正在验证用户名和密码,请稍候......"; //"Authenticating";
break;
case RASCS_Authenticated:
S ="用户名和密码正确,请稍候......"; //"Authenticated";
break;
case RASCS_Connected:
S = "网络连接成功!"; //"Connected";
Form1->AlreadyConnected=true;
Form1->ConnectBtn->Enabled=false;
Form1->HangUpBtn->Enabled=true;
ShellExecute(NULL, NULL,"IEXPLORE.EXE", NULL, NULL, SW_SHOWNORMAL);
break;
case RASCS_Disconnected:
S ="通讯端口已关闭,请稍候......"; //"Disconnected";
break;
}

if(S.Trim()!="")
{
Form1->Memo1->Lines->Add(S);
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
HRASCONN TForm1::CheckForConnections()
{
//拨号状态检测
char buff[256];
RASCONN rc;
rc.dwSize=sizeof(rc);
DWORD numConns;
DWORD size=rc.dwSize;
//枚举系统现有连接
DWORD res=fRasEnumConnections(&rc,&size,&numConns);
if(!&res && numConns==0)//系统现在还没有连接
{
return 0;
}

if(res)
{
//若发生错误则记录下来
fRasGetErrorString(res,buff,sizeof(buff));
Memo1->Lines->Add(buff);
}
else
{
//获取系统连接状态
RASCONNSTATUS status;
status.dwSize=sizeof(status);
res=fRasGetConnectStatus(rc.hrasconn,&status);
if (res)
{
fRasGetErrorString(res,buff,sizeof(buff));
Memo1->Lines->Add(buff);
return 0;
}
else
{
//找到系统现有连接并显示现有连接详细信息
if (status.rasconnstate==RASCS_Connected)
{
Memo1->Lines->Add("系统现有连接状态如下:");
Memo1->Lines->Add("设备类型:"+String(rc.szDeviceType));
Memo1->Lines->Add("设备名称:"+String(rc.szDeviceName));
Memo1->Lines->Add("设备连接到:"+String(rc.szEntryName));
return rc.hrasconn;
}
else
{
//系统检测到一个连接但它正在断开
Form1->Memo1->Lines->Add("系统连接正在断开!");
return 0;
}
}
}
return 0;
}
redrd 2003-06-11
  • 打赏
  • 举报
回复
qiujiao
redrd 2003-06-09
  • 打赏
  • 举报
回复
帮帮我
asimpleman 2003-06-09
  • 打赏
  • 举报
回复
gz
runnerrunning 2003-06-03
  • 打赏
  • 举报
回复
学习
vericky 2003-06-03
  • 打赏
  • 举报
回复
试试这几个函数
InternetAutodial
InternetAutodialHangup
InternetDial
InternetGetConnectedState
InternetHangUp
InternetGoOnline
redrd 2003-06-03
  • 打赏
  • 举报
回复
INTERNETAPI_(DWORD) InternetDial(
IN HWND hwndParent,
IN LPSTR lpszConnectoid,
IN DWORD dwFlags,
OUT LPDWORD lpdwConnection,
IN DWORD dwReserved
);
帮我解释以下参数的意义??????我调用时有返回值,但没有拨号啊!
redrd 2003-06-03
  • 打赏
  • 举报
回复
[Linker Error] Unresolved external 'InternetGetConnectedState' referenced from F:\WORK\TEST\UNIT1.OBJ
为什么有这个错误?????
shanewest1 2003-06-03
  • 打赏
  • 举报
回复
学习
redrd 2003-06-03
  • 打赏
  • 举报
回复
vericky(醉里挑灯看不见):

这几个函数怎么调用啊?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧