本人在WIN7下用RasSetEntryProperties函数创建了一个拨号连接在用RasDialh函数进行拨号时,出现了这样的错误:
   当系统只有一个modem设备的时候,拨号时可以的!当系统有两个modem设备的时候,系统就默认第一个modem,并进行拨号,但是我想用的modem设备是第2个设备,我要怎么通过程序去修改他成为第一个modem设备!  
   如:我的电脑上有两个modem,一个是蓝牙(COM6),一个是3G(COM9)。创建拨号连接的时候系统是默认蓝牙(COM6)为第一拨号设备,我现在就是想改一下他的默认设备为3G (COM9).我看了下华为的客户端软件,它就是这样更改,但是我不知道怎么通过程序去修改!是去修改RasSetEntryProperties里面函数的结构体属性配置?
  希望各路老师帮忙下!很急!
(之前也有飞过这样的帖子,但是没满意的回答,可能是我描述问题不够明确)

解决方案 »

  1.   

    之前也做个同时拨VPN和拨联通3G网卡,虽然VPN跟蓝牙modem不一样,但是对于拨号来说对底层是透明的。拨号可以用RasDialParams里面的szEntryName来唯一标识一个连接(注意不能以拨号号码来标示一个拨号连接)。
    1、对于已经存在的拨号连接(不需要程序创建),可以通过拨号的号码(如联通的*99#,这个号码对一个运营商而言是固定的),找到拨号连接名字,然后赋值给RasDialParams,直接RasDial。
    2、对于要新建拨号连接,可以直接通过RasSetEntryProperties设置RasDialParams参数,然后RasDial。具体参数获得可按下面思路:先手动建立一个3G拨号连接,然后通过RasGetEntryProperties得到RasDialParams参数的各项具体值,这样就可以知道先前创建拨号连接时RasDialParams这个结构体的各个参数如何赋值了。
      

  2.   


    嗯 现在问题解决了,在RasEntry里面有个szDeviceName 的变量是指定modem设备的名字,modem设备的名字可以通过扫描获取。这样再知道modem设备名字的情况下就可以在拨号前进行判断了。扫描的代码如下BOOL   GetModemName(CString*   strModemNameArray)  
      {  
      DWORD   dwSize   =   0;  
      DWORD   dwNumOfDevices   =   0;  
      DWORD   dwRV   =   RasEnumDevices(NULL,   &dwSize,   &dwNumOfDevices);  
      
      RASDEVINFO   *lpRdi   =   new   RASDEVINFO[dwNumOfDevices];  
      lpRdi->dwSize   =   sizeof(*lpRdi);  
      dwRV   =   RasEnumDevices(lpRdi,   &dwSize,   &dwNumOfDevices);  
      if(dwRV   !=   0)  
      {  
      delete   []lpRdi;  
      return   FALSE;  
      }  
      
      CString   strType;  
      int   j   =   0;  
      for(int   i   =   0;   i   <   (int)dwNumOfDevices;   i++)  
      {  
      strType   =   lpRdi[i].szDeviceType;  
      if(strType.CompareNoCase("modem")   ==   0)     //   =   "RASDT_Modem";  
      {  
      strModemNameArray[j]   =   lpRdi[i].szDeviceName;  
      j++;  
      }  
      }  
      delete   []lpRdi;  
      return   TRUE;  
      }  原文见这里http://topic.okbase.net/201001/2010012209/3795541.html
    但现在又有另外一个问题,如果我不知道设备名,怎么从扫描到的设备里得知那个是3G网卡或modem设备?
      

  3.   


    但是 RASDEVINFO这个结构体只有如下三个成员,信息比较少,有别的方法来提取这些信息吗?
    typedef struct tagRASDEVINFO {
      DWORD dwSize;
      TCHAR szDeviceType[RAS_MaxDeviceType + 1];
      TCHAR szDeviceName[RAS_MaxDeviceName + 1];
    } RASDEVINFO;
      

  4.   

    很明显:typedef struct tagRASDEVINFO {
      DWORD dwSize;
      TCHAR szDeviceType[RAS_MaxDeviceType + 1];
      TCHAR szDeviceName[RAS_MaxDeviceName + 1];
    } RASDEVINFO;  对于你那两个都是modem设备,第二个参数值肯定都是RASDT_Modem,而你现在只能扫描出所有szDeviceName的值,不知道对应关系,你这个结构体不能用来区分设备。 况且RASENTRY 这个结构体包含了你这个结构体所有有用的信息。
        我觉得我上文已经说的清楚了,你可以用3G拨号号码来区分3G Modem,这个对一个运营商都是唯一的,或者你还可以得到两个连接的RASENTRY 结构体,比较之,看看有什么参数可以区分,这个我没试过!