`
tempsitegoogle
  • 浏览: 867522 次
文章分类
社区版块
存档分类
最新评论

用Ras的API函数创建一个拨号连接

 
阅读更多
很久以前我们的项目中曾提到过一个需求,因为拨号连接的设置过于繁琐,希望能够在我们的程序中提供输入几个必要的参数,然后自动生成一个拨号连接。当时我对于RAS也是刚刚接触(其实到现在也只是刚刚入了点门),通过查阅资料知道RasSetEntryProperties加上RasSetEntryDialParams可以实现(如果不清楚的,可以查阅MSDN,里面解释的比较清楚),但是这种方法貌似设置不了modem的串口属性、附加拨号命令等一些信息,这样的话还是解决不了我们的问题,因为我们需要的简化的其实就是让用户输入附加拨号命令(就是+CGDCONT=1,"IP","CMNET",0,0,0那么一长串,其实只需要用户输入一个APN就OK了)。
没办法,深入研究贝~MSDN上关于RasSetEntryProperties函数中的倒数第二个参数的解释说明是说它是一个指向包含设备配置信息的缓冲区的指针,但是要查阅关于这个配置信息的更多详细内容,就要看TAPI相关的lineGetDevConfig函数,说实话,TAPI我那次是第一次看到,从来没见过,根据MSDN的连接,查看了一下lineGetDevConfig函数,结果越看越不明白,光是一个line device我就不知道是什么东东~(现在也还不知道:(),看了半天没明白也懒得浪费时间了,不就是一个指针吗,不就是一个buffer吗?而且还是有另外一个参数标明了大小的,怕什么,把这段buffer的数据打印出来我猜总可以了吧~就这样,我打印一次buffer的数据,再把拨号连接的属性设置改了几个地方,再打印一下,对比来看,最后让我弄出个结构定义:
typedef struct { //Offset
unsigned short Reserved1;// 0x00, 通常为0x20
unsigned short WaitForCreditCard; // 0x02
unsigned short CancelTimeOut; // 0x04
unsigned short Reserved2; // 0x06
unsigned char Test1; // 0x08
unsigned char Test2; //0x09
unsigned short Reserved3; // 0x0A
unsigned int BaudRate;// 0x0C
unsigned short Terminal;// 0x10, 通常为0, 1, 3, 7
unsigned char DataBits; // 0x12
unsigned char StopBits; // 0x13
unsigned char Parity; // 0x14
unsigned char FlowControl; // 0x15
TCHAR AtCmd[115]; // 0x16, 可能后面还有别的结构,但我尝试几次都没有看到后面有有效值,因此笼统定义为附加指令
} sDevConfig;
虽然还有些参数没有猜出来,但是这些也够用了。用这个结构在AtCmd中填入附加拨号命令,就可以了(后来发现这个还有一个好处,在PDA上设置附加拨号命令的时候有长度限制,某次用TD的手机设置拨号上网的时候,附加命令特别长,除了上面cgdcont一行还另外加了一句,结果因为长度限制不能够完全输入,但是用这个结构来设置,就可以突破CE系统中的拨号设置中的那个长度限制了)。

用RasSetEntryProperties设置一个Entry的属性的时候,如果Entry的参数中指定的EntryName已经存在了,那么就更改已有的Entry的设置,如果不存在,则创建了一个新的Entry,这样就实现了创建拨号连接的功能,但是之后你马上会发现,在系统的拨号设置界面中找不到用这个方法创建的拨号连接,但是使用RasEnumEntries却是能够枚举出这个连接的。当时也没研究出这个问题,时间上也不允许,就这么搁置了。反正设置、创建拨号连接的功能实现了,而且我们的软件中使用了RasEnumEntries来枚举拨号连接也能够枚举出自定义创建的拨号连接。

到今天,差不多时间也过了快一年了。又碰到了拨号设置的需求问题,正好最近我成了“闲人”,这事又落到我肩膀上~今天又把之前的“成果”拿出来看了看,感觉首要解决的就是要把我们自己创建的拨号连接在系统的拨号连接设置界面中显示出来。从什么地方入手呢?当时研究Ras系列的函数的时候,确实没有发现跟这个相关的设置啊~没法了,看看注册表吧。
我先使用系统设置中的连接设置,在Internet设置中新建了一个名叫“我的连接”的拨号连接,然后用我的小程序创建了另外一个拨号连接(名称随意,只要不叫“我的连接”),完成之后,我就在wince的注册表中搜索“我的连接”,结果还真让我找到一个,在HKCU\comm\RasBook\下面有一个叫我的连接的主键,但是我用程序创建的另外一个连接的名字也在RasBook下面有一个对应的主键,那就只有继续搜索咯~又找到一个,在HKLM\Software\Microsoft\ConnMgr\Providers\{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}\Connections下面有一个主键叫“我的连接”,但是却没有和我的程序创建的连接同名的主键,那么估计就是这里了,再继续搜索一下也没有匹配的结果了,看来这里的可能性非常大。看看这个主键的内容,它下面有三个DWORD的值,一个String类型值,
RequirePw (DWORD) 1
Enabled (DWORD) 1
EntryType (DWORD) 0
DestId (String) "{ADB0B001-10B5-3F39-27C6-9742E785FCD4}"
明显,这个DestId是一个GUID,而且用过ConnMgr系列API的就应该知道DestId这个东东,可以简单的认为它是一个标示拨号网络类型的GUID,和这个Connections同一级的主键当中有一个叫Destinations的主键,展开,它的子键都是一些设置类型包括:“Internet 设置”,“Wap 网络”,“安全 Wap 网络”等,这里就不全部列举了,有兴趣的朋友可以自己看看。打开“Internet 设置”主键,果然也有一个叫DestId的字符串,且值和“我的连接”的DestId相同,那么显然就是这个了,我试着在“Connections”下面建立了一个和我自己程序创建的连接同名的主键,然后在其下加入一个DestId字符串,值就是Internet的DestId,但是打开系统设置-〉连接-〉Internet设置-管理现有连接 还是没有看到我自己创建的连接,只好把“我的连接”主键的几个值如法炮制全给我自己的连接主键加上了,再看,嘿~出来了~~~

那么怎么在程序里实现把自己创建的连接显示出来的思路应该很清晰了吧,写写注册表就OK啦~ :P


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------


在WinCE中,拨号选项的默认值写在注册表common.reg [HKEY_LOCAL_MACHINE\Drivers\Unimodem] "DevConfig"键下,具体格式如下:
#define DEVMINCFG_VERSION 0x0030
//
// Version 0x0030 changes:
// - increase the size of szDialModifier
//
#define DIAL_MODIFIER_LEN 256
#define MAX_CFG_BLOB 126
#define MAX_NAME_LENGTH 8
typedef struct tagDEVMINICFG {
WORD wVersion;
WORD wWaitBong; // DevCfgHdr

DWORD dwCallSetupFailTimer; // CommConfig.ModemSettings
DWORD dwModemOptions; // CommConfig.ModemSettings
// 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

WORD fwOptions; // DevCfgHdr
// TERMINAL_PRE TERMINAL_POST
// MANUAL_DIAL

BYTE ByteSize; // DCB
BYTE StopBits; // DCB
BYTE Parity; // DCB

WCHAR szDialModifier[DIAL_MODIFIER_LEN+1]; // Unique to MiniCfg

// Dynamic devices configuration
WCHAR wszDriverName[MAX_NAME_LENGTH+1];
BYTE pConfigBlob[MAX_CFG_BLOB];
HANDLE hPort;

} DEVMINICFG, *PDEVMINICFG;

格式因版本不同而有所不同。
结构中szDialModifier字段就是博主所说的AtCmd。
注册表的值就是以上结构的二进制数值表示形式。




分享到:
评论

相关推荐

    用Ras的API函数创建一个拨号连接pdf文档

    是一分关于说明ras api函数创建拨号连接的文档,内容取自网上。

    WRas.rar_RasAPI

    RasAPI. 使用此函数库可以管理windows拨号连接,包含拨号,断开,获取所有连接,获取连接统计信息等.

    Delphi高级实验实践(RAS_传真_telnet_API_FTP)

    API(使用API函数实现FTP客户端程序) 3.2、FTP服务器(FTP服务器程序,实现了FTP服务的大部分功能) 4.1、HTTPGET(使用HTTP协议下载web服务器上的文件或网页) 4.2、WebProxy(实现了Web代理服务器的程序...

    VC++开发手机软件(PDF+源码).

    目录 前言 第1章 Windows CE及开发环境概述 1.1 Windows CE概述 1.1.1 Windows CE嵌入式系统概述 1.1.2 Windows CE版本 1.1.3 Windows CE 6.0概述 ...15.4.2 使用MFC向导创建一个简单的ActiveX控件

    Netkeeper:Netkeeper 星空极速2.5的替代拨号软件

    1、 拨号方面使用Windows系统的RAS相关API函数实现 2、 加密模式根据已完成的破解算法实现 3、 其它细节 A.自动连接 程序启动后检测是否已连接, 未连接则停顿一会开始连接 B.记录用户名密码, 使用INI文件保存 C....

    Delphi网络通信协议分析与应用实现pdf清晰

    9.3.3 在程序中创建拨号连接 9.3.4 状态通知 9.4 RAS高级开发拨号程序 9.4.1 创建工程项目 9.4.2 关键代码分析 第10章 传真高级编程 10.1 传真编程的基础知识 10.1.1 T.30传真通信协议 10.1.2 HDLC信息包 ...

    基于多语言编程的拨号上网管理方法与实现 (2006年)

    通过对Windows API中网络服务函数(RAS)的调用,深入Windows内核,实现了应用序对系统"网络与拨号连接"的直接控制。并利用VC++将其封装在动态连接库中,然后再通过Delphi的套接字机制在局域网内服务器和客户机之间...

    delphi网络应用

    目在线检测(网络连接情况检测)5.DNS的更改和设置(获取DNS设置)6.MAC Addr(网卡信息的获取)7.FTP-API(使用API函数实现FTP客户端程序)8.FTP服务器(FTP服务器程序,实现了FTP服务的大部分功能)9.HTTPGET...

    VB网络编程实例

    (已接通) ◆ 02.htm CWinInetConnection---一个封装了WinInet API函数的类 ◆ 03.htm MODEM通讯意外处理 ◆ 04.htm MsComm 文字传输 ◆ 05.htm PING一个IP地址(向它发送一个数据包并等待回应)...

    windows网络编程

    Winsock基础1327.1 Winsock的初始化1327.2 错误检查和控制1347.3 面向连接的协议1347.3.1 服务器API函数1347.3.2 客户机API函数1387.3.3 数据传输1407.3.4 流协议1447.3.5 中断连接1467.3.6 综合分析1477.4 无连接...

    VB编程资源大全(源码 网络)

    i018_networ~1.zip 显示局域网的相关信息(6KB) 116,i017_e-checker.zip 使用Winsock控制检测是否有邮件, 邮件服务器必须支持POP3(30KB) 117,i016_map.zip 用API函数映射和断开网络驱动器(3KB) 118...

    windows网络编程技术

    Winsock基础1327.1 Winsock的初始化1327.2 错误检查和控制1347.3 面向连接的协议1347.3.1 服务器API函数1347.3.2 客户机API函数1387.3.3 数据传输1407.3.4 流协议1447.3.5 中断连接1467.3.6 综合分析1477.4 无连接...

    Windows网络编程(PDF).rar

    441.7 小结 44第2章 重定向器 452.1 通用命名规范 452.2 多UNC提供者 472.3 网络提供者 472.4 重定向器简介 482.5 服务器消息块 482.6 安全问题 492.6.1 安全描述符 492.6.2 访问令牌 512.7 网络安全 512.8 一个实例...

    windows网络编程(PDF)

    Winsock基础1327.1 Winsock的初始化1327.2 错误检查和控制1347.3 面向连接的协议1347.3.1 服务器API函数1347.3.2 客户机API函数1387.3.3 数据传输1407.3.4 流协议1447.3.5 中断连接1467.3.6 综合分析1477.4 无连接...

    Windows网络编程

    441.7 小结 44第2章 重定向器 452.1 通用命名规范 452.2 多UNC提供者 472.3 网络提供者 472.4 重定向器简介 482.5 服务器消息块 482.6 安全问题 492.6.1 安全描述符 492.6.2 访问令牌 512.7 网络安全 512.8 一个实例...

Global site tag (gtag.js) - Google Analytics