• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            玩心未泯

            卡爾斯希普拉斯

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              19 Posts :: 0 Stories :: 98 Comments :: 0 Trackbacks
                很久以前我們的項(xiàng)目中曾提到過一個(gè)需求,因?yàn)閾芴?hào)連接的設(shè)置過于繁瑣,希望能夠在我們的程序中提供輸入幾個(gè)必要的參數(shù),然后自動(dòng)生成一個(gè)撥號(hào)連接。當(dāng)時(shí)我對(duì)于RAS也是剛剛接觸(其實(shí)到現(xiàn)在也只是剛剛?cè)肓它c(diǎn)門),通過查閱資料知道RasSetEntryProperties加上RasSetEntryDialParams可以實(shí)現(xiàn)(如果不清楚的,可以查閱MSDN,里面解釋的比較清楚),但是這種方法貌似設(shè)置不了modem的串口屬性、附加撥號(hào)命令等一些信息,這樣的話還是解決不了我們的問題,因?yàn)槲覀冃枰暮喕钠鋵?shí)就是讓用戶輸入附加撥號(hào)命令(就是+CGDCONT=1,"IP","CMNET",0,0,0那么一長串,其實(shí)只需要用戶輸入一個(gè)APN就OK了)。
                 沒辦法,深入研究貝~MSDN上關(guān)于RasSetEntryProperties函數(shù)中的倒數(shù)第二個(gè)參數(shù)的解釋說明是說它是一個(gè)指向包含設(shè)備配置信息的緩沖區(qū)的指針,但是要查閱關(guān)于這個(gè)配置信息的更多詳細(xì)內(nèi)容,就要看TAPI相關(guān)的lineGetDevConfig函數(shù),說實(shí)話,TAPI我那次是第一次看到,從來沒見過,根據(jù)MSDN的連接,查看了一下lineGetDevConfig函數(shù),結(jié)果越看越不明白,光是一個(gè)line device我就不知道是什么東東~(現(xiàn)在也還不知道:(),看了半天沒明白也懶得浪費(fèi)時(shí)間了,不就是一個(gè)指針嗎,不就是一個(gè)buffer嗎?而且還是有另外一個(gè)參數(shù)標(biāo)明了大小的,怕什么,把這段buffer的數(shù)據(jù)打印出來我猜總可以了吧~就這樣,我打印一次buffer的數(shù)據(jù),再把撥號(hào)連接的屬性設(shè)置改了幾個(gè)地方,再打印一下,對(duì)比來看,最后讓我弄出個(gè)結(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ù)沒有猜出來,但是這些也夠用了。用這個(gè)結(jié)構(gòu)在AtCmd中填入附加撥號(hào)命令,就可以了(后來發(fā)現(xiàn)這個(gè)還有一個(gè)好處,在PDA上設(shè)置附加撥號(hào)命令的時(shí)候有長度限制,某次用TD的手機(jī)設(shè)置撥號(hào)上網(wǎng)的時(shí)候,附加命令特別長,除了上面cgdcont一行還另外加了一句,結(jié)果因?yàn)殚L度限制不能夠完全輸入,但是用這個(gè)結(jié)構(gòu)來設(shè)置,就可以突破CE系統(tǒng)中的撥號(hào)設(shè)置中的那個(gè)長度限制了)。

                用RasSetEntryProperties設(shè)置一個(gè)Entry的屬性的時(shí)候,如果Entry的參數(shù)中指定的EntryName已經(jīng)存在了,那么就更改已有的Entry的設(shè)置,如果不存在,則創(chuàng)建了一個(gè)新的Entry,這樣就實(shí)現(xiàn)了創(chuàng)建撥號(hào)連接的功能,但是之后你馬上會(huì)發(fā)現(xiàn),在系統(tǒng)的撥號(hào)設(shè)置界面中找不到用這個(gè)方法創(chuàng)建的撥號(hào)連接,但是使用RasEnumEntries卻是能夠枚舉出這個(gè)連接的。當(dāng)時(shí)也沒研究出這個(gè)問題,時(shí)間上也不允許,就這么擱置了。反正設(shè)置、創(chuàng)建撥號(hào)連接的功能實(shí)現(xiàn)了,而且我們的軟件中使用了RasEnumEntries來枚舉撥號(hào)連接也能夠枚舉出自定義創(chuàng)建的撥號(hào)連接。

                 到今天,差不多時(shí)間也過了快一年了。又碰到了撥號(hào)設(shè)置的需求問題,正好最近我成了“閑人”,這事又落到我肩膀上~今天又把之前的“成果”拿出來看了看,感覺首要解決的就是要把我們自己創(chuàng)建的撥號(hào)連接在系統(tǒng)的撥號(hào)連接設(shè)置界面中顯示出來。從什么地方入手呢?當(dāng)時(shí)研究Ras系列的函數(shù)的時(shí)候,確實(shí)沒有發(fā)現(xiàn)跟這個(gè)相關(guān)的設(shè)置啊~沒法了,看看注冊(cè)表吧。
                 我先使用系統(tǒng)設(shè)置中的連接設(shè)置,在Internet設(shè)置中新建了一個(gè)名叫“我的連接”的撥號(hào)連接,然后用我的小程序創(chuàng)建了另外一個(gè)撥號(hào)連接(名稱隨意,只要不叫“我的連接”),完成之后,我就在wince的注冊(cè)表中搜索“我的連接”,結(jié)果還真讓我找到一個(gè),在HKCU\comm\RasBook\下面有一個(gè)叫我的連接的主鍵,但是我用程序創(chuàng)建的另外一個(gè)連接的名字也在RasBook下面有一個(gè)對(duì)應(yīng)的主鍵,那就只有繼續(xù)搜索咯~又找到一個(gè),在HKLM\Software\Microsoft\ConnMgr\Providers\{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}\Connections下面有一個(gè)主鍵叫“我的連接”,但是卻沒有和我的程序創(chuàng)建的連接同名的主鍵,那么估計(jì)就是這里了,再繼續(xù)搜索一下也沒有匹配的結(jié)果了,看來這里的可能性非常大。看看這個(gè)主鍵的內(nèi)容,它下面有三個(gè)DWORD的值,一個(gè)String類型值,
            RequirePw (DWORD) 1
            Enabled (DWORD)            1
            EntryType (DWORD)         0
            DestId   (String)                 "{ADB0B001-10B5-3F39-27C6-9742E785FCD4}"
            明顯,這個(gè)DestId是一個(gè)GUID,而且用過ConnMgr系列API的就應(yīng)該知道DestId這個(gè)東東,可以簡單的認(rèn)為它是一個(gè)標(biāo)示撥號(hào)網(wǎng)絡(luò)類型的GUID,和這個(gè)Connections同一級(jí)的主鍵當(dāng)中有一個(gè)叫Destinations的主鍵,展開,它的子鍵都是一些設(shè)置類型包括:“Internet 設(shè)置”,“Wap 網(wǎng)絡(luò)”,“安全 Wap 網(wǎng)絡(luò)”等,這里就不全部列舉了,有興趣的朋友可以自己看看。打開“Internet 設(shè)置”主鍵,果然也有一個(gè)叫DestId的字符串,且值和“我的連接”的DestId相同,那么顯然就是這個(gè)了,我試著在“Connections”下面建立了一個(gè)和我自己程序創(chuàng)建的連接同名的主鍵,然后在其下加入一個(gè)DestId字符串,值就是Internet的DestId,但是打開系統(tǒng)設(shè)置-〉連接-〉Internet設(shè)置-管理現(xiàn)有連接 還是沒有看到我自己創(chuàng)建的連接,只好把“我的連接”主鍵的幾個(gè)值如法炮制全給我自己的連接主鍵加上了,再看,嘿~出來了~~~
                 那么怎么在程序里實(shí)現(xiàn)把自己創(chuàng)建的連接顯示出來的思路應(yīng)該很清晰了吧,寫寫注冊(cè)表就OK啦~ :P
            posted on 2007-07-16 19:13 SuperPlayeR 閱讀(12361) 評(píng)論(8)  編輯 收藏 引用 所屬分類: WinCE/Mobile應(yīng)用開發(fā)

            評(píng)論

            # re: 用Ras的API函數(shù)創(chuàng)建一個(gè)撥號(hào)連接 2007-08-01 10:54 NULL
            樓主的開源精神值的表演
            這個(gè)問題我也找了許久,但網(wǎng)上幾乎沒有資料
            感謝樓主的奉獻(xiàn)  回復(fù)  更多評(píng)論
              

            # re: 用Ras的API函數(shù)創(chuàng)建一個(gè)撥號(hào)連接 2007-08-09 11:40 SuperPlayeR
            一個(gè)朋友研究了在smartphone上建立GPRS撥號(hào)連接的情況,貼出一些代碼供需要的朋友參考:
            http://cpp.sourceforge.net/?show=39205

            怕這個(gè)鏈接以后會(huì)失效,我還是先copy一份過來。

            #include "stdafx.h"

            #include <wchar.h>

            #include <tapi.h>
            #include <tsp.h>

            #include <ras.h>
            #include <raserror.h>

            #include <vector>

            DWORD FindCellLine()
            {
            LONG lRet = 0;
            DWORD dwDeviceNum = 0;
            DWORD dwDeviceID = -1, dwTapiVersion = TAPI_CURRENT_VERSION;

            HLINEAPP hLineApp = NULL;

            LINEINITIALIZEEXPARAMS initParams = {0};
            initParams.dwTotalSize = sizeof(initParams);
            initParams.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;

            std::vector<char> buffer(1024, '\0');
            LPLINEDEVCAPS devcaps =(LINEDEVCAPS*) &buffer[0];

            devcaps->dwTotalSize = buffer.size();

            lRet = lineInitializeEx(&hLineApp, GetModuleHandle(NULL), NULL,
            L"GPRS Device Finder", &dwDeviceNum, &dwTapiVersion, &initParams);

            if (lRet != 0)
            return -1;

            for(DWORD dwDeviceIndex = 0; dwDeviceIndex != dwDeviceNum; dwDeviceIndex++)
            {
            lineGetDevCaps(hLineApp, dwDeviceIndex, dwTapiVersion, 0, devcaps);

            if (devcaps->dwNeededSize > devcaps->dwTotalSize)
            {
            buffer.resize(devcaps->dwNeededSize);
            devcaps =(LINEDEVCAPS*) &buffer[0];
            devcaps->dwTotalSize = buffer.size();

            dwDeviceIndex--;
            continue;
            }

            if (wcscmp((LPCTSTR) &buffer[devcaps->dwLineNameOffset],
            CELLTSP_LINENAME_STRING) == 0)
            {
            dwDeviceID = dwDeviceIndex;
            break;
            }
            }

            lineShutdown(hLineApp);

            return dwDeviceID;
            }

            BOOL SetupGprsRasEntry(LPWSTR szEntryName, LPCWSTR szAccessPointName)
            {
            DWORD dwLineID = 0;
            std::vector<char> buffer(sizeof(VARSTRING) + sizeof(CELLDEVCONFIG), '\0');

            LPVARSTRING varbuffer =(LPVARSTRING) &buffer[0];
            varbuffer->dwTotalSize = buffer.size();

            LPCELLDEVCONFIG cellcfg = NULL;

            {//查找Cell Line的設(shè)備ID
            if ((dwLineID = FindCellLine()) == -1)
            return FALSE;
            }

            {//獲得默認(rèn)數(shù)據(jù)配置
            if (lineGetDevConfig(dwLineID, varbuffer, L"comm/datamodem") != 0)
            return FALSE;

            cellcfg =(LPCELLDEVCONFIG) &buffer[varbuffer->dwStringOffset];
            }

            {//開始配置GPRS數(shù)據(jù)
            cellcfg->bGPRSConnectionInfoValid = TRUE;

            memset(&cellcfg->cgciGPRSConnectionInfo, 0x00,
            sizeof(cellcfg->cgciGPRSConnectionInfo));

            wcscpy(cellcfg->cgciGPRSConnectionInfo.wszAccessPointName, szAccessPointName);

            cellcfg->cgciGPRSConnectionInfo.dwProtocolType = CELLDEVCONFIG_GPRSPROTOCOL_IP;
            cellcfg->cgciGPRSConnectionInfo.dwL2ProtocolType = CELLDEVCONFIG_GPRSL2PROTOCOL_PPP;
            cellcfg->cgciGPRSConnectionInfo.dwDataCompression = CELLDEVCONFIG_GPRSCOMPRESSION_OFF;
            cellcfg->cgciGPRSConnectionInfo.dwHeaderCompression = CELLDEVCONFIG_GPRSCOMPRESSION_OFF;
            }

            {//安裝GPRS撥號(hào)項(xiàng)
            RASENTRY rsaentry = {0};

            rsaentry.dwSize = sizeof(rsaentry);
            rsaentry.dwfOptions = RASEO_ProhibitEAP|RASEO_RemoteDefaultGateway;
            rsaentry.dwfNetProtocols = RASNP_Ip;
            rsaentry.dwFramingProtocol = RASFP_Ppp;

            wcscpy(rsaentry.szDeviceName, CELLTSP_LINENAME_STRING);
            wcscpy(rsaentry.szDeviceType, RASDT_Modem);
            wcscpy(rsaentry.szLocalPhoneNumber, L"~GPRS!");

            if (RasSetEntryProperties(NULL, szEntryName, &rsaentry, sizeof(rsaentry),
            (LPBYTE) cellcfg, sizeof(*cellcfg)) != 0)
            return FALSE;
            }

            return TRUE;
            }

              回復(fù)  更多評(píng)論
              

            # re: 用Ras的API函數(shù)創(chuàng)建一個(gè)撥號(hào)連接 2007-09-10 21:57 scott
            非常感謝  回復(fù)  更多評(píng)論
              

            # re: 用Ras的API函數(shù)創(chuàng)建一個(gè)撥號(hào)連接 2007-09-11 11:43 SuperPlayeR
            后來發(fā)現(xiàn)在Mobile5上,注冊(cè)表結(jié)構(gòu)發(fā)生了變化
            HKLM\Software\Microsoft\ConnMgr\Providers\{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}\Connections
            變成了
            HKLM\Comm\ConnMgr\Providers\{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}\Connections
            而且連接的鍵值中多了一個(gè)GUID,目前還不知道如何生成或者獲取的。  回復(fù)  更多評(píng)論
              

            # re: 用Ras的API函數(shù)創(chuàng)建一個(gè)撥號(hào)連接 2008-01-30 14:18 PF775
            大大請(qǐng)問一下 :

            下面這些參數(shù)是lineGetDevConfig( dwDeviceID, lpDeviceConfig,lpszDeviceClass)的第幾個(gè)參數(shù)項(xiàng) 感謝

            typedef struct { //Offset
            unsigned short Reserved1; // 0x00
            ……………………………….
            } sDevConfig;
              回復(fù)  更多評(píng)論
              

            # 用API設(shè)置撥號(hào)模式,希望有幫助 2008-03-12 11:37 kiapper
            // Set the dialing patterns as we need.
            // Unfortunately, there is no documented API for modifying the dialing parameters
            // in Windows CE. All of the dialing parameters/patterns are stored in the registry,
            // so we have to finish our work by operating registry.
            BOOL RasSetDialingPatterns(VOID)
            {
            HKEY hKey;
            DWORD dataType = REG_MULTI_SZ;
            TCHAR szKeyName[] = TEXT("0");
            LONG retVal = 0;
            LONG ConfigurationStringSize = 512;
            TCHAR ConfigurationString[512];
            memset(ConfigurationString, '\0', 512);

            // Build the configuration string.
            wcscat(ConfigurationString, TEXT("Work")); // dialing from
            wcscat(ConfigurationString, TEXT("$"));

            wcscat(ConfigurationString, TEXT("G")); // local calls
            wcscat(ConfigurationString, TEXT("$"));

            wcscat(ConfigurationString, TEXT("G")); // long distance calls
            wcscat(ConfigurationString, TEXT("$"));

            wcscat(ConfigurationString, TEXT("G")); // international calls
            wcscat(ConfigurationString, TEXT("$"));

            wcscat(ConfigurationString, TEXT("021")); // local area code
            wcscat(ConfigurationString, TEXT("$"));

            wcscat(ConfigurationString, TEXT("")); // disable call waiting by dialing
            wcscat(ConfigurationString, TEXT("$"));

            wcscat(ConfigurationString, TEXT("86")); // country/region code
            wcscat(ConfigurationString, TEXT("$"));

            wcscat(ConfigurationString, TEXT("0")); // tone or pulse
            wcscat(ConfigurationString, TEXT("$"));

            // Format the string correctly, take care please
            int ConfigStringLen = wcslen(ConfigurationString);

            for (int x = 0; x < ConfigStringLen; x++)
            {
            if (ConfigurationString[x] == '$')
            {
            ConfigurationString[x] = '\0';
            }
            }

            // Open the registry key.
            retVal = RegOpenKeyEx(HKEY_CURRENT_USER , TEXT("ControlPanel\\Dial\\Locations"), 0, KEY_READ, &hKey);

            if (retVal != ERROR_SUCCESS)
            {
            return FALSE;
            }
            // Set the value of the key.
            retVal = RegSetValueEx(hKey, szKeyName, NULL, dataType, (PBYTE)ConfigurationString, ConfigurationStringSize);
            RegCloseKey(hKey);

            if (retVal != ERROR_SUCCESS)
            {
            return FALSE;
            }
            else
            {
            return TRUE;
            }
            }  回復(fù)  更多評(píng)論
              

            # re: 用Ras的API函數(shù)創(chuàng)建一個(gè)撥號(hào)連接 2008-03-13 12:32 kiapper
            在WinCE中,撥號(hào)選項(xiàng)的默認(rèn)值寫在注冊(cè)表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;

            格式因版本不同而有所不同。
            結(jié)構(gòu)中szDialModifier字段就是博主所說的AtCmd。
            注冊(cè)表的值就是以上結(jié)構(gòu)的二進(jìn)制數(shù)值表示形式。
              回復(fù)  更多評(píng)論
              

            # re: 用Ras的API函數(shù)創(chuàng)建一個(gè)撥號(hào)連接 2008-07-03 15:43 Jemini
            樓主說的是HKLM\Comm\Rasbook下面各主鍵下的Devcfg,而樓上說的是Unimodem下的DevConfig,這兩個(gè)是不一樣的。  回復(fù)  更多評(píng)論
              

            777久久精品一区二区三区无码| 色欲久久久天天天综合网精品| 久久青青草原国产精品免费 | 国产精品美女久久久| 999久久久无码国产精品| 91久久精品电影| 久久人做人爽一区二区三区| 色综合久久久久无码专区| 精品一区二区久久| 久久久久青草线蕉综合超碰 | 久久综合视频网| 国产精品久久久99| 欧美亚洲国产精品久久久久| 999久久久无码国产精品| 久久大香萑太香蕉av| 久久综合丁香激情久久| 久久综合亚洲色一区二区三区| 国产精品视频久久| 亚洲午夜久久久影院伊人| 久久99精品国产麻豆蜜芽| 国产精品美女久久久久网| 久久精品一区二区三区AV| 久久伊人中文无码| 成人国内精品久久久久影院VR| 久久久女人与动物群交毛片| 热久久国产欧美一区二区精品| 久久综合亚洲欧美成人| 久久久久久久久久久| 久久精品国产精品亚洲人人| av无码久久久久不卡免费网站| 久久精品国产亚洲AV蜜臀色欲| 久久国产成人| 国产精品综合久久第一页| 久久99精品综合国产首页| 99久久精品毛片免费播放| 国产美女久久精品香蕉69| 久久国产色AV免费观看| 久久久久久人妻无码| 99久久无码一区人妻a黑| 成人久久久观看免费毛片| 久久99精品国产99久久|