主要问题是通过代码拨号:当我尝试时,我遇到了其他问题。虽然上面来自 Hogo 的代码帮助很大,但有一些技巧对无忧编码有用:
首先,以下提示要求您手动拨号连接并通过在 Internet Explorer 上运行任何网站来测试您的 Internet。如果互联网正常工作,那么您最好通过代码拨号。
要手动执行:
使用“网络和拨号连接”建立一个名为“GPRS”的新连接(使用此链接:http ://www.e-consystems.com/gprs.asp )。如果您使用 airtel SIM 将波特率从 19200 更改为 115200。连接它并检查互联网是否正常工作。
通过代码拨号:
当您手动创建名为“GPRS”的连接时,GPRS 文件夹下会生成 3 个寄存器。(HKEY_CURRENT_USER\Comm\RasBook\GPRS) 。这些文件夹无法正常查看。需要在PDA中安装读取寄存器的应用程序。无需查看里面的内容,如果您这样做,则根据windows版本下载它们。
在创建的 3 个寄存器中,只有两个是相关的(DevCfg 和 Entry)。手动拨号并连接到 Internet 后,将数据从 DevCfg 和 Entry 寄存器复制到文本文件(DevCfg.txt 和 Entry.txt),以便以后可以复制回这些值。要将寄存器复制到/从寄存器复制到文本文件,请使用:RegQueryValueEx(...)、RegOpenKeyEx(..)、RegSetValueEx(...) 和其他相关函数(请参阅http://msdn.microsoft.com/en-us/库/windows/desktop/ms724911%28v=vs.85%29.aspx )
例如:读取寄存器并写入文本文件:
public static bool ReadRegString(IntPtr hKey, string lpszSubKey, string lpValueName)
{
try
{
string str = "";
byte[] lpData = new byte[684];
uint lpcbValue = 684;
uint dwType = Utils.REG_BINARY;
IntPtr phkResult = new IntPtr();
Utils.RegOpenKeyEx(hKey, lpszSubKey, 0, 0, ref phkResult);
if (phkResult != IntPtr.Zero)
{
int x = Utils.RegQueryValueEx(phkResult, lpValueName, 0, ref dwType, lpData, ref lpcbValue);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 684; i++)
{
if (i != 683)
sb.Append(lpData[i].ToString() + "|");
else
sb.Append(lpData[i].ToString());
}
using (System.IO.StreamWriter outfile = new System.IO.StreamWriter(filePath))
{
outfile.Write(sb.ToString());
}
Utils.RegCloseKey(phkResult);
}
}
if (Utils.ReadRegString(Utils.HKEY_CURRENT_USER, @"Comm\RasBook\GPRS", "DevCfg"))
{
textBoxSysVers.Text = "Succeeded Make Text File.";
}
- 现在通过代码拨打我们使用RasEntry(添加必要的库;检查Hogo在Making GPRS Connection programmatically using C# for windows CE 5.0中的答案?)
a) 创建 RasEntry 对象
b) 将创建的文本文件“Entry.txt 和 DevCfg.txt”中的数据分别复制到寄存器 Entry 和 DevCfg。
c) 拨号 RasError re = cEntry.Dial(...)
例如:
private const string CONNAME = "GPRS";
private const string PHONENR = "*99#";
private const string USER = "xx";
private const string PWD = "xx";
private const string DEVICE_TYPE = "modem";
private const string DEVICE_NAME = "Cellular Line";
{ RasEntry cEntry = new RasEntry()
{
Name = CONNAME,
CountryCode = 91,
AreaCode = "120",
PhoneNumber = PHONENR,
DeviceName = DEVICE_NAME,
DeviceType = DEVICE_TYPE,
IPAddress = "0.0.0.0",
IPAddressDns = "0.0.0.0",Options=4194304
};
RasDialParams dialParams = new RasDialParams()
{
UserName = USER,
Password = PWD,
EntryName = CONNAME,
Domain = " "
}
if (Utils.WriteRegValue(Utils.HKEY_CURRENT_USER, @"Comm\RasBook\GPRS", "DevCfg","Entry",3))
{
RasError re = cEntry.Dial(false, new RasDialParams(CONNAME, USER, PWD));
RasError rs = re;
textBoxInfo.Text = re.ToString() + " : Dial Status";
if(rs.ToString()=="Success")
textBoxInfo.Text = cEntry.Status.State.ToString() + " : Dial Status";
}
}
public static Boolean WriteRegValue(IntPtr hKey, string lpszSubKey, string lpValueName1, string lpValueName1,uint dwType)
{
int iOper = 1;
filePath = @"`enter code here`\DevCfg.txt";
IntPtr phkResult = new IntPtr();
Utils.RegOpenKeyEx(hKey, lpszSubKey, 0, 0, ref phkResult);
if (phkResult == IntPtr.Zero)
{
int iSecurity = 0;
int dwDisp = 0;
RegCreateKeyEx(hKey, lpszSubKey, 0, null, 0, 0, ref iSecurity, ref phkResult, ref dwDisp);
}
if (phkResult != IntPtr.Zero)
{
byte[] bytes = new byte[684];
string[] text = new string[684];
using (System.IO.StreamReader streamReader = new System.IO.StreamReader(filePath, Encoding.UTF8))
{
text = streamReader.ReadToEnd().Split('|');
}
for (int i = 0; i < 684; i++)
{
bytes[i] = Convert.ToByte(Convert.ToInt32(text[i]));
}
iOper = Utils.RegSetValueEx(phkResult, lpValueName1, 0, dwType, bytes, (uint)bytes.Length);
Utils.RegCloseKey(phkResult);
} }
// 类似地从 lpValueName2 做
}}
hogo 的代码和 this 之间的区别在于 RasEntry 不是在这里创建的。它由寄存器提供。我在创建对象时遇到了困难,因此提出了建议。希望能帮助到你 :)