#include <windows.h>
#include <ras.h>
#pragma comment(lib, "Rasapi32.lib")
#include "Resource.h"
BOOL WINAPI DlgProc(HWND,UINT,WPARAM,LPARAM);
BOOL RasEnum(HWND hwnd);
BOOL RasCreate();
BOOL RasConnect(char *userName, char *passWord, char *error, char *strIP);
HRASCONN RasConnecting();
BOOL RasClose(HRASCONN hrasconn);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
HWND hDlg;
hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)&DlgProc);
if (hDlg == 0)
{
MessageBox(NULL,"CreateDialog false","",0);
return 0;
}
ShowWindow(hDlg, SW_SHOW);
while (GetMessage(&msg, NULL, 0, 0))
{
if (IsDialogMessage(hDlg, &msg) == FALSE)
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return 0;
}
BOOL WINAPI DlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
char userName[128]; //存放用户名
char hex_userName[128];
char passWord[128]; //存放密码
char error[256]; //存放错误信息
char strIP[20]; //存放ip
HRASCONN hrasconn = NULL; //存放活动连接句柄, 用于断开连接
memset(error, 0, sizeof(error));
switch(uMsg)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
if(RasEnum(hWnd)==FALSE) //如果不存在“我的连接”
{
RasCreate();
Sleep(1000);
}
if((hrasconn=RasConnecting()) != NULL)
{
MessageBox(NULL, "\r\n已经连接!\r\n", "", 0);
return FALSE;
}
GetDlgItemText(hWnd, IDC_EDIT1, userName, 100);
GetDlgItemText(hWnd, IDC_EDIT2, passWord, 100);
if(RasConnect(userName, passWord, error, strIP) == TRUE)
{
SetDlgItemText(hWnd, IDC_STATIC3, strIP);
return TRUE;
}
else
{
SetDlgItemText(hWnd, IDC_STATIC3, "连接失败 ! ");
MessageBox(NULL,error,"连接失败",0);
}
break;
case IDCANCEL:
if((hrasconn=RasConnecting()) != NULL) //如果是已经连接
{
if(RasClose(hrasconn) == TRUE)
{
SetDlgItemText(hWnd, IDC_STATIC3, "已断开连接! ");
}
}
break;
}
break;
case WM_INITDIALOG:
return TRUE;
case WM_CLOSE:
PostQuitMessage (WM_QUIT);
return TRUE;
default:
return FALSE;
}
return TRUE;
}
//-----枚举拨号连接-----
BOOL RasEnum(HWND hwnd)
{
RASENTRYNAME RasName[10];
memset(RasName, 0, sizeof(RasName));
RasName[0].dwSize = sizeof(RASENTRYNAME);
DWORD rasSize, rasNumber, dwRet;
rasSize = sizeof(RasName);
rasNumber = 0;
dwRet = RasEnumEntries(NULL, NULL, RasName, &rasSize, &rasNumber); //如果函数成功,则返回0
if(dwRet == 0)
{
for(UINT i=0; i<rasNumber; i++)
if(strcmp(RasName[i].szEntryName, "我的连接") == 0)
{
return TRUE;
}
}
return FALSE;
}
//-----创建拨号连接-----
BOOL RasCreate()
{
LPRASENTRY lpRasEntry = NULL;
DWORD cb = sizeof(RASENTRY);
DWORD dwBufferSize = 0;
// 取得entry的大小,这句也不知道是不是必须的,因为sizeof(RASENTRY)和这里取到的dwBufferSize是一样的,不过还是Get一下安全点
RasGetEntryProperties(NULL,"", NULL, &dwBufferSize, NULL, NULL);
if (dwBufferSize == 0)
return FALSE;
lpRasEntry = (LPRASENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
if (lpRasEntry == NULL)
return FALSE;
ZeroMemory(lpRasEntry, sizeof(RASENTRY));
lpRasEntry->dwSize = dwBufferSize;
lpRasEntry->dwfOptions = RASEO_RemoteDefaultGateway | RASEO_ShowDialingProgress | RASEO_PreviewUserPw;
lpRasEntry->dwType = RASET_Broadband;
lstrcpy(lpRasEntry->szDeviceType, RASDT_PPPoE);
lstrcpy(lpRasEntry->szDeviceName, "ppoe");
lpRasEntry->dwfNetProtocols = RASNP_Ip;
lpRasEntry->dwFramingProtocol = RASFP_Ppp;
DWORD dwRet;
dwRet = RasSetEntryProperties(NULL, "我的连接", lpRasEntry, dwBufferSize, NULL, 0); // 创建连接
HeapFree(GetProcessHeap(), 0, (LPVOID)lpRasEntry);
if (dwRet != 0)
{
MessageBox(NULL, "\r\n无法创建网络连接,请手动创建并命名为 \"我的连接\"\r\n", "错误", 0);
return FALSE;
}
return TRUE;
}
//-----进行拨号连接-----
BOOL RasConnect(char *userName, char *passWord, char *error, char *strIP)
{ //HRASCONN *pRC用于记录拨号信息存放的地址
HRASCONN hRasConn = NULL;
RASDIALPARAMS RasParams;
ZeroMemory(&RasParams, sizeof(RASDIALPARAMS));
RasParams.dwSize = sizeof(RASDIALPARAMS);
lstrcpy(RasParams.szEntryName, "我的连接");
lstrcpy(RasParams.szUserName, userName);
lstrcpy(RasParams.szPassword, passWord);
DWORD dwRet;
dwRet = RasDial(NULL, NULL, &RasParams, 0L, NULL , &hRasConn); //如果函数成功, 则返回0
if (dwRet != 0)
{
RasGetErrorString((UINT)dwRet, (LPSTR)error, 265);
return FALSE;
}
//-----获得IP-----
RASPPPIP RasIp;
memset(&RasIp, 0, sizeof(RasIp));
RasIp.dwSize=sizeof(RASPPPIP);
DWORD rasSize=sizeof(RASPPPIP);
RasGetProjectionInfo(hRasConn, RASP_PppIp, &RasIp, &rasSize);
strcpy(strIP, "连接成功:");
strcat(strIP, RasIp.szIpAddress);
return TRUE;
}
//-----枚举活动的连接-----
HRASCONN RasConnecting()
{
RASCONN rc[10];
DWORD dwSize;
DWORD dwNumber = 0;
rc[0].dwSize=sizeof(RASCONN);
dwSize =sizeof(rc);
DWORD dwRet;
dwRet = RasEnumConnections(rc, &dwSize, &dwNumber); //枚举已连接的网络
if(dwRet == 0)
{
for(UINT i=0; i<dwNumber; i++)
if(strcmp(rc[i].szEntryName, "我的连接") == 0)
{
return rc[i].hrasconn; //返回"我的连接"对应的句柄
}
}
return NULL;
}
//-----断开连接-----
BOOL RasClose(HRASCONN hrasconn)
{
if(RasHangUp(hrasconn) == 0) //断开成功
return TRUE;
else
return FALSE;
}