青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

玩心未泯

卡爾斯希普拉斯

C++博客 首頁 新隨筆 聯系 聚合 管理
  19 Posts :: 0 Stories :: 98 Comments :: 0 Trackbacks
    很久以前我們的項目中曾提到過一個需求,因為撥號連接的設置過于繁瑣,希望能夠在我們的程序中提供輸入幾個必要的參數,然后自動生成一個撥號連接。當時我對于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
posted on 2007-07-16 19:13 SuperPlayeR 閱讀(12404) 評論(8)  編輯 收藏 引用 所屬分類: WinCE/Mobile應用開發

評論

# re: 用Ras的API函數創建一個撥號連接 2007-08-01 10:54 NULL
樓主的開源精神值的表演
這個問題我也找了許久,但網上幾乎沒有資料
感謝樓主的奉獻  回復  更多評論
  

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

怕這個鏈接以后會失效,我還是先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的設備ID
if ((dwLineID = FindCellLine()) == -1)
return FALSE;
}

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

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

{//開始配置GPRS數據
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撥號項
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;
}

  回復  更多評論
  

# re: 用Ras的API函數創建一個撥號連接 2007-09-10 21:57 scott
非常感謝  回復  更多評論
  

# re: 用Ras的API函數創建一個撥號連接 2007-09-11 11:43 SuperPlayeR
后來發現在Mobile5上,注冊表結構發生了變化
HKLM\Software\Microsoft\ConnMgr\Providers\{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}\Connections
變成了
HKLM\Comm\ConnMgr\Providers\{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}\Connections
而且連接的鍵值中多了一個GUID,目前還不知道如何生成或者獲取的。  回復  更多評論
  

# re: 用Ras的API函數創建一個撥號連接 2008-01-30 14:18 PF775
大大請問一下 :

下面這些參數是lineGetDevConfig( dwDeviceID, lpDeviceConfig,lpszDeviceClass)的第幾個參數項 感謝

typedef struct { //Offset
unsigned short Reserved1; // 0x00
……………………………….
} sDevConfig;
  回復  更多評論
  

# 用API設置撥號模式,希望有幫助 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;
}
}  回復  更多評論
  

# re: 用Ras的API函數創建一個撥號連接 2008-03-13 12:32 kiapper
在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。
注冊表的值就是以上結構的二進制數值表示形式。
  回復  更多評論
  

# re: 用Ras的API函數創建一個撥號連接 2008-07-03 15:43 Jemini
樓主說的是HKLM\Comm\Rasbook下面各主鍵下的Devcfg,而樓上說的是Unimodem下的DevConfig,這兩個是不一樣的。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产成人不卡| 亚洲欧美一区二区在线观看| 香蕉成人啪国产精品视频综合网| 最新国产の精品合集bt伙计| 欧美激情综合五月色丁香| 亚洲欧洲日本在线| 亚洲国产天堂久久综合| 欧美日韩国产成人高清视频| 亚洲少妇在线| 亚洲自拍偷拍视频| 国产午夜精品美女视频明星a级| 久久久国产一区二区三区| 久久精品国产亚洲高清剧情介绍| 影视先锋久久| 日韩亚洲国产欧美| 国产精品一区视频网站| 久久亚洲欧美| 欧美精品少妇一区二区三区| 亚洲一品av免费观看| 午夜精品亚洲一区二区三区嫩草| 精品不卡视频| 亚洲免费观看| 国产一区亚洲一区| 亚洲国产精品123| 国产精品视频精品视频| 美国十次成人| 国产精品久久久久久久午夜| 久久久久久一区| 欧美日韩中文字幕| 欧美成年人视频网站| 国产精品高潮在线| 欧美国产日韩二区| 国产欧美一区二区精品性 | 国产欧美日韩中文字幕在线| 老鸭窝亚洲一区二区三区| 欧美精品综合| 麻豆成人在线播放| 国产精品日韩欧美综合| 亚洲国产经典视频| 红杏aⅴ成人免费视频| 亚洲网站视频| 久久久久一区二区三区四区| 亚洲一区欧美二区| 欧美高清视频一二三区| 久久久精品欧美丰满| 欧美日韩综合一区| 亚洲高清毛片| 尤物精品国产第一福利三区 | 欧美激情精品久久久久久黑人 | 国产精品热久久久久夜色精品三区| 狂野欧美一区| 国产亚洲视频在线| 亚洲在线播放电影| 亚洲私人影院| 欧美日韩国产色站一区二区三区| 免费精品视频| 国产综合精品一区| 欧美一区二区黄色| 亚洲欧美成人| 国产精品久久97| 99精品视频免费观看| 99精品视频免费| 欧美成人中文字幕| 亚洲盗摄视频| 亚洲精品在线一区二区| 欧美va天堂| 亚洲风情亚aⅴ在线发布| 亚洲第一区在线观看| 久久午夜电影网| 欧美xart系列高清| 亚洲国产欧美一区二区三区久久| 久久精品伊人| 免费成人性网站| 亚洲国产视频一区| 猛干欧美女孩| 亚洲精品在线观看免费| 一区二区三区国产精华| 欧美亚洲不卡| 午夜精品久久久久久久久久久久久 | 亚洲黄色av| 欧美日韩不卡| 一区二区三区欧美视频| 午夜视频精品| 在线播放中文一区| 欧美激情精品久久久久久黑人| 亚洲激情av在线| 亚洲婷婷免费| 国产最新精品精品你懂的| 久久精品视频在线播放| 亚洲大黄网站| 香蕉亚洲视频| 在线精品国产欧美| 欧美日本韩国一区二区三区| 亚洲午夜精品网| 久久中文字幕一区| 中日韩午夜理伦电影免费| 国产麻豆精品视频| 久久综合色播五月| 99视频超级精品| 久久蜜臀精品av| 亚洲视频一区在线| 久久亚洲国产成人| 99国产麻豆精品| 久久伊人亚洲| 亚洲少妇在线| 怡红院精品视频在线观看极品| 欧美片第一页| 久久久免费精品视频| 亚洲精品一区二区三区在线观看| 欧美在线视频在线播放完整版免费观看 | 国产精品盗摄久久久| 久久露脸国产精品| 亚洲视频在线观看| 亚洲国产美女久久久久| 久久精品一级爱片| 亚洲在线日韩| 亚洲精品美女在线观看| 国产午夜精品一区二区三区视频 | 午夜精品久久久久久久99水蜜桃| 亚洲国产一区二区三区在线播 | 亚洲精品国产精品乱码不99| 久久一区二区三区av| 亚洲欧美日本精品| a4yy欧美一区二区三区| 亚洲成人直播| 国产中文一区二区| 国产老女人精品毛片久久| 欧美日韩一区二区三区高清| 美女诱惑黄网站一区| 久久国产精品一区二区三区| 亚洲女人小视频在线观看| 99视频+国产日韩欧美| 亚洲国产精品一区二区www在线 | 久热精品在线| 久久九九99视频| 欧美伊人久久| 性色av一区二区三区在线观看| 一区二区日韩欧美| 99精品99久久久久久宅男| 亚洲人成艺术| 亚洲美女视频在线免费观看| 亚洲国产老妈| 亚洲精品国偷自产在线99热| 伊人久久成人| 亚洲大胆女人| 亚洲国产欧美一区二区三区丁香婷| 一色屋精品视频在线观看网站| 国产最新精品精品你懂的| 狠狠色丁香婷婷综合影院| 国产视频观看一区| 国产视频久久久久| 影音欧美亚洲| 亚洲精品中文字幕有码专区| 亚洲精品资源| 亚洲自啪免费| 欧美亚洲专区| 裸体丰满少妇做受久久99精品| 久久久精品网| 欧美高清不卡| 亚洲美女在线国产| 亚洲性感美女99在线| 欧美亚洲免费电影| 久久久女女女女999久久| 欧美二区在线看| 欧美日韩免费在线| 国产免费成人| 女女同性女同一区二区三区91| 欧美国产精品一区| 欧美午夜宅男影院| 韩国精品主播一区二区在线观看| 国内精品伊人久久久久av一坑 | 欧美日韩国产小视频在线观看| 国产精品国产三级国产aⅴ9色| 国产欧美日韩不卡免费| 在线免费观看日本欧美| 一区二区三区四区五区在线| 午夜精品久久久久久久久| 久色成人在线| 亚洲精品亚洲人成人网| 亚洲欧美日韩在线观看a三区| 久久婷婷久久| 国产精品大片wwwwww| 亚洲大胆视频| 香蕉久久夜色精品国产| 欧美成人精品在线播放| 亚洲一区二区三区精品在线观看 | 久久成人免费视频| 欧美激情一二区| 国产一区二区精品久久91| 一区二区三区波多野结衣在线观看| 性感少妇一区| 亚洲啪啪91| 久久久久在线| 国产欧美日韩视频| 一本大道久久a久久精品综合| 久久成人18免费观看| 亚洲精品永久免费| 麻豆精品在线视频| 国产一区视频观看| 午夜精品久久久久久99热|