wince RAS

RAS功能需要引入#include <ras.h>

相关错误信息需要引入#include <Raserror.h>

功能1:枚举所有活动的连接并hangup指定的gprs

 RASCONN entries[25];

//::memset(entries,0,sizeof(RASCONN));
DWORD bufsize=0;
DWORD numEntries=0;
bufsize=25*sizeof(RASCONN);
entries[0].dwSize=sizeof(RASCONN);//必须
RASCONNSTATUS status;//RAS状态在ras.h中可以查找到。
        status.dwSize=sizeof(RASCONNSTATUS);
if(RasEnumConnections(entries,&bufsize,&numEntries)==0)//枚举所有活动的连接
{
for(DWORD i=0;i<numEntries;i++)
{
if(lstrcmp(entries[i].szEntryName,_T("GPRS"))==0 && RasHangUp(entries[i].hrasconn)==0)//挂断名称为gprs的连接
{
while(RasGetConnectStatus(entries[i].hrasconn,&status)==0)//得到连接的状态(能获取得到)
{
Sleep(0);
//Sleep(n)的作用是让当前线程睡眠n毫秒,以便执行其他线程,如果没有其他线程,那睡眠n毫秒后,继续执行。

    //而如果n=0,Sleep(0)是指CPU交出当前线程的执行权,让CPU去执行其他线程。也就是放弃当前线程的时间片,转而执行其他线程。 

}
}
}
}

功能2:枚举所有电话簿(获取本地的gprs名称),对应的注册表为HKEY_CURRENT_USER\Comm\RasBook下的值

RASENTRYNAME *lprasentryname;
DWORD cEntries;
DWORD cb;
lprasentryname=(LPRASENTRYNAME)LocalAlloc(LPTR,sizeof(RASENTRYNAME));
lprasentryname->dwSize=sizeof(RASENTRYNAME);
DWORD nRet;
//首次调用RasEnumEntries函数来获取缓冲区的大小
if((nRet=RasEnumEntries(NULL,NULL,lprasentryname,&cb,&cEntries))==0)
{
::LocalFree(lprasentryname);
lprasentryname=(LPRASENTRYNAME)GlobalAlloc(GPTR,cb);
lprasentryname->dwSize=sizeof(RASENTRYNAME);
}
//再次调用RasEnumEntries函数列举电话簿条目
nRet=RasEnumEntries(NULL,NULL,lprasentryname,&cb,&cEntries);
if(nRet !=ERROR_SUCCESS)
{
printf("aaaaaaaaa\n");
}
else
{
for(int i=0;i<cEntries;i++)
{
printf("%s\n",lprasentryname->szEntryName);
          lprasentryname++;
}
}

    GlobalFree(lprasentryname); 

 功能3:建立拔号连接

RASDIALPARAMS rdParams;
HRASCONN hRasConn=NULL;
//初始化参数
rdParams.dwSize=sizeof(RASDIALPARAMS);
lstrcpy(rdParams.szEntryName,_T("GPRS"));
lstrcpy(rdParams.szPhoneNumber,_T(""));
lstrcpy(rdParams.szCallbackNumber,_T(""));
       lstrcpy(rdParams.szPhoneNumber,_T(""));
lstrcpy(rdParams.szUserName,_T(""));
lstrcpy(rdParams.szPassword,_T(""));
lstrcpy(rdParams.szDomain,_T(""));
DWORD dwRet;

      // WINCE下GPRS 只支持以下两种拔号方式

//同步建立拔号连接
//dwRet=RasDial(NULL,NULL,&rdParams,NULL,NULL,&hRasConn);//同步
//异步
dwRet=RasDial(NULL,NULL,&rdParams,0xFFFFFFFF,窗体句柄,&hRasConn);//通过给窗体发送WM_RASDIALEVENT消息。  (RASCONNSTATE) wParam; dwError = (DWORD) lParam; // error that may have occurred 
if(dwRet !=0)//拔号失败
{

 功能4:删除gprs本地连接 

                  RasDeleteEntry(NULL,_T("GPRS")); //第一个参数为NULL(NULL uses the current default phone-book file)

 功能5:创建gprs本地连接  

DWORD CreateGPRS(const LPWSTR pszEntryName,const LPCTSTR pszUserName,const LPCTSTR pszPassWord)
{
RASENTRY rasEntry;
RASDIALPARAMS rdParams;
DWORD rasEntrySize,dwResult;
/*验证RASENTRY名称是否有效*/
    dwResult = RasValidateEntryName(NULL, pszEntryName);
if(dwResult!=ERROR_SUCCESS)
{
if(dwResult==ERROR_ALREADY_EXISTS)
{
                      return -1;
}
else
{
            return -2;
}
}
   
memset(&rasEntry,0,sizeof(rasEntry));
rasEntrySize=sizeof(rasEntry);
rasEntry.dwSize=rasEntrySize;
    DEVMINICFG tmpsDevConfig;
DWORD tmpsDevConfigLength=sizeof(DEVMINICFG);
    
    
if(RasGetEntryProperties(NULL,_T(""),&rasEntry,&rasEntrySize,(LPBYTE)&tmpsDevConfig,&tmpsDevConfigLength) !=0)
{
          return -2;
}
lstrcpy(rasEntry.szDeviceType,RASDT_Modem);
lstrcpy(rasEntry.szDeviceName, TEXT("COM1 上的 Hayes 兼容调制解调器:"));
lstrcpy(rasEntry.szAreaCode, TEXT("10"));
lstrcpy(rasEntry.szLocalPhoneNumber,_T("*99***1#"));
rasEntry.dwCountryCode=86;//国家代码
tmpsDevConfig.wVersion = 0x30 ;
tmpsDevConfig.dwBaudRate = 115200 ;
tmpsDevConfig.ByteSize = 8 ;
tmpsDevConfig.StopBits = 0;
tmpsDevConfig.Parity = 0 ;
tmpsDevConfig.dwModemOptions = MDM_BLIND_DIAL ;
lstrcpy( tmpsDevConfig.szDialModifier,_T("+CGDCONT=1,\"IP\",\"CMNET\"")) ;
if(RasSetEntryProperties(NULL,pszEntryName,&rasEntry, sizeof(rasEntry),(LPBYTE)(&tmpsDevConfig),tmpsDevConfigLength)!=0)
{
        return -2;
}
    ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
    rdParams.dwSize = sizeof(RASDIALPARAMS);
/*设置拔号的用户名和密码*/
    lstrcpy(rdParams.szEntryName, pszEntryName);
    lstrcpy(rdParams.szUserName, pszUserName);
    lstrcpy(rdParams.szPassword, pszPassWord);
if(RasSetEntryDialParams(NULL, &rdParams, FALSE)!=0)
{
return -2;
}
return 1;

 DEVMINICFG为记录TAPI相关的配置信息,定义如下:

#ifndef _DEVMINICFG_H_
#define _DEVMINICFG_H_
#define DIAL_MODIFIER_LEN 256
#define MAX_CFG_BLOB  126
#define MAX_NAME_LENGTH   8
// Modem Options
#define MDM_COMPRESSION      0x00000001
#define MDM_ERROR_CONTROL    0x00000002
#define MDM_FORCED_EC        0x00000004
#define MDM_CELLULAR         0x00000008
#define MDM_FLOWCONTROL_HARD 0x00000010
#define MDM_FLOWCONTROL_SOFT 0x00000020
#define MDM_CCITT_OVERRIDE   0x00000040
#define MDM_SPEED_ADJUST     0x00000080
#define MDM_TONE_DIAL        0x00000100
#define MDM_BLIND_DIAL       0x00000200
#define MDM_V23_OVERRIDE     0x00000400
typedef struct  tagDEVMINICFG  { 
    WORD  wVersion; //0
    WORD  wWaitBong;            // DevCfgHdr 2
    
    DWORD dwCallSetupFailTimer;  // CommConfig.ModemSettings 4
    DWORD dwModemOptions;        // CommConfig.ModemSettings 8
// MDM_BLIND_DIAL   MDM_FLOWCONTROL_SOFT 
// MDM_CCITT_OVERRIDE MDM_FORCED_EC 
// MDM_CELLULAR      MDM_SPEED_ADJUST 
// MDM_COMPRESSION    MDM_TONE_DIAL 
// MDM_ERROR_CONTROL  MDM_V23_OVERRIDE 
// MDM_FLOWCONTROL_HARD 
    
    DWORD dwBaudRate;            // DCB 12
    WORD  fwOptions;            // DevCfgHdr 16
// TERMINAL_PRE  TERMINAL_POST 
// MANUAL_DIAL 
    BYTE  ByteSize;              // DCB 18
    BYTE  StopBits;              // DCB 19
    BYTE  Parity;                // DCB 20
    WCHAR szDialModifier[DIAL_MODIFIER_LEN+1];    // Unique to MiniCfg 256+1
    // Dynamic devices configuration 
    WCHAR  wszDriverName[MAX_NAME_LENGTH+1]; //8+1
    BYTE    pConfigBlob[MAX_CFG_BLOB]; //126+1
    HANDLE  hPort; //4
} DEVMINICFG; 

#endif 

 

posted @ 2012-11-12 15:06  广拓小程序  阅读(2092)  评论(3编辑  收藏  举报