简单介绍在
Windows Mobile
系统上创建网络连接的
2
种方法。
1, 通过用于更改系统配置的API DMProcessConfigXML。
2,创建的拨号连接的操作,其实是创建一个Phone-Book Entries,并将其存入注册表中。Phone-Book Entries包括一组值,例如用户名,密码,phone number ,network protocols等,操作系统使用Phone-Book Entries中的值创建RAS 连接。方法二通过RAS API 创建一个Phone-Book Entries,并在注册表中填入相应的项。
方法一: 通过DMProcessConfigXML
DMProcessConfigXML是一个用于修改系统配置的API。这个函数接受使用OMA Client Provisioning XML描述的配置信息。
[DllImport(
"
aygshell.dll
"
)]
private
extern
static
UInt32 DMProcessConfigXML(
string
xmlIn, UInt32 flag,
out
IntPtr xmlOutPtr);
我们只需要将需要建立的拨号连接参数,用指定的XMl格式描述出来,然后传递给它,即可。
IntPtr xmlOutPtr;
long result;
result = DMProcessConfigXML(xml, (uint)flag, out xmlOutPtr);
System.Diagnostics.Debug.Assert(result == 0);
//此处一定要释放掉 xmlOutPtr所指向的内存
相应的XML示例:
<
wap-provisioningdoc
>
<
characteristic
type
="CM_GPRSEntries"
>
<
characteristic
type
="我的连接1"
>
<
parm
name
="DestId"
value
="{ADB0B001-10B5-3F39-27C6-
9742E785FCD4}"
/>
<
parm
name
="CountryCode"
value
="0"
/>
<
parm
name
="AreaCode"
value
=""
/>
<
parm
name
="Phone"
value
="#777"
/>
<
parm
name
="UserName"
value
="******"
/>
<
parm
name
="Password"
value
="******"
/>
<
parm
name
="Domain"
value
=""
/>
<
parm
name
="DeviceType"
value
="modem"
/>
<
parm
name
="DeviceName"
value
="Cellular Line"
/>
<
parm
name
="Enabled"
value
="1"
/>
<
parm
name
="RequirePw"
value
="1"
/>
</
characteristic
>
</
characteristic
>
</
wap-provisioningdoc
>
上面XML建立了一个名为“我的连接1”的拨号连接.
其中CM_GPRSEntries是Configuration Service Provider,用于配置网络连接。关于其支持的所有参数,以及详细的XML格式,可以参考MSDN 上的文档。
此处有一个问题。以上的XML指定了“我的连接1",使用的设备名称为"电话线路(Cellular Line)",可是调用DMProcessConfigXML后,用新创建的连接拨号,提示错误“找不到设备”。开始以为是设备名称有误,但是使用RAS API函数RasGetEntryProperties获取设备名称(通过正常工作的,使用电话线路的连接),得到的名称的确是“Cellular Line”,无奈之下只好用设备的序列号来指定设备。
<
wap-provisioningdoc
>
<
characteristic
type
="CM_GPRSEntries"
>
<
characteristic
type
="我的连接1"
>
<
parm
name
="DestId"
value
="{ADB0B001-10B5-3F39-27C6-
9742E785FCD4}"
/>
<
parm
name
="CountryCode"
value
="0"
/>
<
parm
name
="AreaCode"
value
=""
/>
<
parm
name
="Phone"
value
="#777"
/>
<
parm
name
="UserName"
value
="******"
/>
<
parm
name
="Password"
value
="******"
/>
<
parm
name
="Domain"
value
=""
/>
<
parm
name
="DeviceType"
value
="modem"
/>
<
parm
name
="DeviceName"
value
="Cellular Line"
/>
<
parm
name
="Enabled"
value
="1"
/>
<
parm
name
="RequirePw"
value
="1"
/>
<
parm
name
='DeviceSpecificRAW'
value
='B4010000B4010000B4010000010000000F0000000100000002000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000'
/>
</
characteristic
>
</
characteristic
>
</
wap-provisioningdoc
>
设备序列号即注册表目录HKEY_CURRENT_USER\Comm\RasBook\下的值DevCfg
方法二 通过RAS API
创建的拨号连接的操作,其实是创建一个Phone-Book Entries,并将其存入注册表中。Phone-Book Entries包括一组值,例如用户名,密码,phone number ,network protocols等,操作系统使用Phone-Book Entries中的值创建RAS 连接。
我们可以使用Ras Api :
[DllImport(
"
coredll.dll
"
)]
public
static
extern
UInt32 RasGetEntryProperties(
string
lpszPhoneBook,
string
szEntry,
IntPtr lpEntry,
ref
UInt32 lpdwEntrySize,
char
[] lpb,
ref
uint
dwSize);
将一个Phone-Book Entries对象保存到注册表里。OpenNETCF有一个类库RAS library ,封装了Ras相关的操作,你可以Codeplex上获取到。
为了使 RasGetEntryProperties创建的连接可以显示在windows mobile中的设置--系统--连接---管理现有连接里,你需要再注册表中写入一些值。
RegistryKey hklm
=
Registry.LocalMachine;
hklm
=
hklm.OpenSubKey(
"
Comm
"
);
hklm
=
hklm.OpenSubKey(
"
ConnMgr
"
);
hklm
=
hklm.OpenSubKey(
"
Providers
"
);
hklm
=
hklm.OpenSubKey(
"
{7C4B7A38-5FF7-4bc1-80F6-5DA7870BB1AA}
"
);
hklm
=
hklm.OpenSubKey(
"
Connections
"
,
true
);
RegistryKey MASCA
=
hklm.CreateSubKey(lpszName);
hklm
=
hklm.OpenSubKey(lpszName,
true
);
hklm.SetValue(
"
EntryType
"
,
0
, RegistryValueKind.DWord);
hklm.SetValue(
"
Enabled
"
,
1
, RegistryValueKind.DWord);
hklm.SetValue(
"
RequirePW
"
,
1
, RegistryValueKind.DWord);
//
hklm.SetValue("DestId", "{ADB0B001-10B5-3F39-27C6-9742E785FCD4}", RegistryValueKind.String);
hklm.SetValue(
"
DestId
"
,
"
{B8F853C5-2CCF-4CA6-957B-B3A41AC8C9D8}
"
, RegistryValueKind.String);
hklm.Close();
又有一个问题(
),通过这种方法创建的连接,使用连接管理API函数ConnMgrMapConRef 获取不到它的Connection GUID,
但是在“设置--系统--连接---管理现有连接里”,点击连接,拨号成功,然后才可以获取到Connection Guid .目前尚不知道如何解决这个问题。