• 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 

  • 相关阅读:
    dubbo和spring的@service注解区别
    mybatisplus乐观锁
    mybatis中llike模糊查询中#和$的使用,以及bind标签的使用
    mybatis的两个内置参数
    mybatis返回主键
    mybatis使用foreach进行批量保存
    jsp自定义标签
    java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver
    junit测试框架
    junit断言和junit注释assert
  • 原文地址:https://www.cnblogs.com/fujinliang/p/2766344.html
Copyright © 2020-2023  润新知