很久以前我們的項目中曾提到過一個需求,因為撥號連接的設(shè)置過于繁瑣,希望能夠在我們的程序中提供輸入幾個必要的參數(shù),然后自動生成一個撥號連接。當(dāng)時我對于RAS也是剛剛接觸(其實到現(xiàn)在也只是剛剛?cè)肓它c門),通過查閱資料知道RasSetEntryProperties加上RasSetEntryDialParams可以實現(xiàn)(如果不清楚的,可以查閱MSDN,里面解釋的比較清楚),但是這種方法貌似設(shè)置不了modem的串口屬性、附加撥號命令等一些信息,這樣的話還是解決不了我們的問題,因為我們需要的簡化的其實就是讓用戶輸入附加撥號命令(就是+CGDCONT=1,"IP","CMNET",0,0,0那么一長串,其實只需要用戶輸入一個APN就OK了)。
沒辦法,深入研究貝~MSDN上關(guān)于RasSetEntryProperties函數(shù)中的倒數(shù)第二個參數(shù)的解釋說明是說它是一個指向包含設(shè)備配置信息的緩沖區(qū)的指針,但是要查閱關(guān)于這個配置信息的更多詳細內(nèi)容,就要看TAPI相關(guān)的lineGetDevConfig函數(shù),說實話,TAPI我那次是第一次看到,從來沒見過,根據(jù)MSDN的連接,查看了一下lineGetDevConfig函數(shù),結(jié)果越看越不明白,光是一個line device我就不知道是什么東東~(現(xiàn)在也還不知道:(),看了半天沒明白也懶得浪費時間了,不就是一個指針嗎,不就是一個buffer嗎?而且還是有另外一個參數(shù)標(biāo)明了大小的,怕什么,把這段buffer的數(shù)據(jù)打印出來我猜總可以了吧~就這樣,我打印一次buffer的數(shù)據(jù),再把撥號連接的屬性設(shè)置改了幾個地方,再打印一下,對比來看,最后讓我弄出個結(jié)構(gòu)定義:
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, 可能后面還有別的結(jié)構(gòu),但我嘗試幾次都沒有看到后面有有效值,因此籠統(tǒng)定義為附加指令
} sDevConfig;
雖然還有些參數(shù)沒有猜出來,但是這些也夠用了。用這個結(jié)構(gòu)在AtCmd中填入附加撥號命令,就可以了(后來發(fā)現(xiàn)這個還有一個好處,在PDA上設(shè)置附加撥號命令的時候有長度限制,某次用TD的手機設(shè)置撥號上網(wǎng)的時候,附加命令特別長,除了上面cgdcont一行還另外加了一句,結(jié)果因為長度限制不能夠完全輸入,但是用這個結(jié)構(gòu)來設(shè)置,就可以突破CE系統(tǒng)中的撥號設(shè)置中的那個長度限制了)。
用RasSetEntryProperties設(shè)置一個Entry的屬性的時候,如果Entry的參數(shù)中指定的EntryName已經(jīng)存在了,那么就更改已有的Entry的設(shè)置,如果不存在,則創(chuàng)建了一個新的Entry,這樣就實現(xiàn)了創(chuàng)建撥號連接的功能,但是之后你馬上會發(fā)現(xiàn),在系統(tǒng)的撥號設(shè)置界面中找不到用這個方法創(chuàng)建的撥號連接,但是使用RasEnumEntries卻是能夠枚舉出這個連接的。當(dāng)時也沒研究出這個問題,時間上也不允許,就這么擱置了。反正設(shè)置、創(chuàng)建撥號連接的功能實現(xiàn)了,而且我們的軟件中使用了RasEnumEntries來枚舉撥號連接也能夠枚舉出自定義創(chuàng)建的撥號連接。
到今天,差不多時間也過了快一年了。又碰到了撥號設(shè)置的需求問題,正好最近我成了“閑人”,這事又落到我肩膀上~今天又把之前的“成果”拿出來看了看,感覺首要解決的就是要把我們自己創(chuàng)建的撥號連接在系統(tǒng)的撥號連接設(shè)置界面中顯示出來。從什么地方入手呢?當(dāng)時研究Ras系列的函數(shù)的時候,確實沒有發(fā)現(xiàn)跟這個相關(guān)的設(shè)置啊~沒法了,看看注冊表吧。
我先使用系統(tǒng)設(shè)置中的連接設(shè)置,在Internet設(shè)置中新建了一個名叫“我的連接”的撥號連接,然后用我的小程序創(chuàng)建了另外一個撥號連接(名稱隨意,只要不叫“我的連接”),完成之后,我就在wince的注冊表中搜索“我的連接”,結(jié)果還真讓我找到一個,在HKCU\comm\RasBook\下面有一個叫我的連接的主鍵,但是我用程序創(chuàng)建的另外一個連接的名字也在RasBook下面有一個對應(yīng)的主鍵,那就只有繼續(xù)搜索咯~又找到一個,在HKLM\Software\Microsoft\ConnMgr\Providers\{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}\Connections下面有一個主鍵叫“我的連接”,但是卻沒有和我的程序創(chuàng)建的連接同名的主鍵,那么估計就是這里了,再繼續(xù)搜索一下也沒有匹配的結(jié)果了,看來這里的可能性非常大。看看這個主鍵的內(nèi)容,它下面有三個DWORD的值,一個String類型值,
RequirePw (DWORD) 1
Enabled (DWORD) 1
EntryType (DWORD) 0
DestId (String) "{ADB0B001-10B5-3F39-27C6-9742E785FCD4}"
明顯,這個DestId是一個GUID,而且用過ConnMgr系列API的就應(yīng)該知道DestId這個東東,可以簡單的認為它是一個標(biāo)示撥號網(wǎng)絡(luò)類型的GUID,和這個Connections同一級的主鍵當(dāng)中有一個叫Destinations的主鍵,展開,它的子鍵都是一些設(shè)置類型包括:“Internet 設(shè)置”,“Wap 網(wǎng)絡(luò)”,“安全 Wap 網(wǎng)絡(luò)”等,這里就不全部列舉了,有興趣的朋友可以自己看看。打開“Internet 設(shè)置”主鍵,果然也有一個叫DestId的字符串,且值和“我的連接”的DestId相同,那么顯然就是這個了,我試著在“Connections”下面建立了一個和我自己程序創(chuàng)建的連接同名的主鍵,然后在其下加入一個DestId字符串,值就是Internet的DestId,但是打開系統(tǒng)設(shè)置-〉連接-〉Internet設(shè)置-管理現(xiàn)有連接 還是沒有看到我自己創(chuàng)建的連接,只好把“我的連接”主鍵的幾個值如法炮制全給我自己的連接主鍵加上了,再看,嘿~出來了~~~
那么怎么在程序里實現(xiàn)把自己創(chuàng)建的連接顯示出來的思路應(yīng)該很清晰了吧,寫寫注冊表就OK啦~ :P