Windows Mobile程式中如果要使用http或socket串連伺服器,需要先串連網路。可以使用ConnMgrEstablishConnectionSync函數來串連。
DWORD dwStatus = 0;
HANDLE hConnection = NULL;
CONNMGR_CONNECTIONINFO sConInfo;
memset(&sConInfo, 0 ,sizeof(CONNMGR_CONNECTIONINFO));
sConInfo.cbSize = sizeof(CONNMGR_CONNECTIONINFO);
sConInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
sConInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
sConInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP
|CONNMGR_FLAG_PROXY_WAP
|CONNMGR_FLAG_PROXY_SOCKS4
|CONNMGR_FLAG_PROXY_SOCKS5;
sConInfo.bExclusive = FALSE;
sConInfo.bDisabled = FALSE;
sConInfo.guidDestNet = IID_DestNetWAP;
ConnMgrEstablishConnectionSync(&sConInfo, &hConnection, 15000, &dwStatus);
如果知道一個存取點的名稱,則可以通過ConnMgrEnumDestinations得到相應存取點的guidDestNet。然後可以使用底層的INET介面串連HTTP了。完了嗎?沒有。還有個問題:Proxy 伺服器。我們都知道,移動的CMNET不需要代理,CMWAP則需要。存取點中可能含有Proxy 伺服器資訊,而且接入類型包括HTTP、WAP、安全WAP、Socks等等,每一種都可能需要不同的代理。不要奢望ConnMgrEnumDestinations函數可以得到這麼多的東東。
事實上,微軟是提供了一個函數的,這就是傳說中的ConnMgrProviderMessage。怎麼樣,這下總該圓滿了吧?...還沒完,接著往下走。
我測的結果,在真機上,這個函數從來沒有成功過,Never。鬱悶之極。與簽名有關嗎?未可知。
正面強攻不行。打槍的不要,悄悄的進村。我們來看看手機的註冊表。在HKEY_LOCAL_MACHINE/Comm/ConnMgr項下,有詳細的存取點的資訊。Destinations子項下列出了手機所有的存取點,相應的索引值有DestId這一項。我們的目光再跳到與ConnMgr平級的Providers項,也有很多資訊,其中一子項{EF097F4C-DC4B-4c98-8FF6-AEF805DC0E8E},快接近我們要的寶貝了。該項有很多子項,我們遍曆每一項,直到找到一個索引值SrcId與我們上面說的DestId相等。看到了吧,與SrcId平級的索引值有很多,不過我們目前需要的就那麼兩項,Type和Proxy。Type就是上面說的接入類型(HTTP、WAP、安全WAP、Socks等),而Proxy正是我們淒淒慘慘戚戚尋尋覓覓的一串字元。
以上是Windows Mobile5.0的結果。在Pocket PC2003和Smartphone2003中,HKEY_LOCAL_MACHINE/Comm/ConnMgr對應為HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/ConnMgr。
至此,尋寶經曆告一段落。