zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式
    6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
    AtCoder Grand Contest 044 A Pay to Win 贪心
    5.29 省选模拟赛 树的染色 dp 最优性优化
    luogu P6097 子集卷积 FST FWT
    CF724C Ray Tracing 扩展欧几里得 平面展开
    5.30 省选模拟赛 方格操作 扫描线 特殊性质
    5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
    Spring main方法中怎么调用Dao层和Service层的方法
    Bug -- WebService报错(两个类具有相同的 XML 类型名称 "{http://webService.com/}getPriceResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。)
  • 原文地址:https://www.cnblogs.com/fujinliang/p/2766344.html
Copyright © 2011-2022 走看看