初始类声明与 C# 中的声明相同:
|
Private Shared SERVICE_PROVIDER As Long = &H6F46 <StructLayout(LayoutKind.Sequential)> _ <System.Runtime.InteropServices.DllImport("sms.dll")> _ <System.Runtime.InteropServices.DllImport("cellcore.dll")> _ <System.Runtime.InteropServices.DllImport("cellcore.dll")> _ <System.Runtime.InteropServices.DllImport("cellcore.dll")> _ <System.Runtime.InteropServices.DllImport("cellcore.dll")> _ GetPhoneNumber 函数相当于 C# 实现。首先创建缓冲区空间,并使用 P/Invoke 调用 SmsGetPhoneNumber 函数。 Dim phoneaddr As PhoneAddress = New PhoneAddress Try If (res.ToInt32 <> 0) Then |
然后从返回的结构中获取地址类型信息。
phoneaddr.AddressType =
System.Runtime.InteropServices.Marshal.ReadInt32(ipAddr)
将返回的电话号码缓冲区转换为一个字符串,然后返回完整的 PhoneAddress 结构。
GetServiceProvider 函数的情况也与 C# 版本中的情况非常相似。
|
Dim hSim, res As IntPtr res = SimInitialize(IntPtr.Zero, Nothing, IntPtr.Zero, hSim) |
首先初始化 SIM,以便从中检索数据。
| Dim rec As SimRecord = New SimRecord rec.cbSize = Marshal.AllocHLocal(System.Runtime.InteropServices .Marshal.SizeOf(temp)) rec.cbSize = IntPtr.op_Explicit(System.Runtime.InteropServices .Marshal.SizeOf(rec)) |
创建一个新的 SimRecord 结构实例且只设置 cbSize 成员(并用 SimRecord 结构的大小填充该成员)。
| res = SimGetRecordInfo(hSim, IntPtr.op_Explicit(SERVICE_PROVIDER), rec) If (res.ToInt32 <> 0) Then Throw New Exception("无法从 SMS 中读取服务提供程序的 信息。") End If |
调用 SimGetRecordInfo,获取包含 SERVICE_PROVIDER 数据的 SIM 记录的句柄。
|
Dim bData((rec.dwSize).ToInt32 + 1) As Byte res = SimReadRecord(hSim, IntPtr.op_Explicit(SERVICE_PROVIDER), |
然后,正如在 C# 代码中执行的操作一样,必须从产生的字节缓冲区中删除任何非 ASCII 字符,然后转换为字符串并返回该字符串值。
|
Dim bScrubbed(dwBytesRead.ToInt32) As Byte '删除非 ASCII 字符 SimDeinitialize(hSim) Return System.Text.ASCIIEncoding.ASCII.GetString(bScrubbed, 0, |
代码使用
要使用 C# 从代码中创建电话呼叫,请调用:
Microsoft.Wireless.Phone.MakeCall("电话号码");
要使用 C# 从代码中获取 SIM 用户的电话号码,请调用:
Microsoft.Wireless.Sim.GetPhoneNumber()(该函数返回一个字符串)
要使用 C# 从代码中获取 SIM 用户的服务提供程序,请调用:
Microsoft.Wireless.Sim.GetServiceProvider()(该函数返回一个字符串)
要使用 VB.NET 从代码中创建电话呼叫,请调用:
Phone.MakeCall("电话号码");
要使用 VB.NET 从代码中获取 SIM 用户的电话号码,请调用:
Sim.GetPhoneNumber()(该函数返回一个字符串)
要使用 VB.NET 从代码中获取 SIM 用户的服务提供程序,请调用:
Sim.GetServiceProvider()(该函数返回一个字符串)
小结
本文旨在进一步说明从托管代码中调用重要的 Win32 API 函数类是非常有用且非常容易的。文中简要介绍了电话 API 类的使用。很明显,使用 P/Invoke 可以更好地利用 Win32 API 编程的功能。
相关专题
- .NET Framework新手入门 (132篇文章)
- .NET移动与嵌入式技术 (5950篇文章)
- .NET开发手册 (5652篇文章)
- .NET框架架构 (465篇文章)
- vb.net入门——ToolBar 控件的使用 (267次浏览)
- vb.net入门——OpenFileDialog 组件的使用 (75次浏览)
- vb.net入门——FontDialog 组件的使用 (52次浏览)
- vb.net用Graphics画一个五角星 (46次浏览)
- vb.net入门——FolderBrowserDialog 组件的使 (45次浏览)
- vb.net绘制干扰点 (44次浏览)
- vb.net入门——ColorDialog 组件的使用 (41次浏览)
- vb.net巧用ToolTip控件获取鼠标坐标 (39次浏览)
- 用vb.net创建一个鼠标绘图程序 (39次浏览)
- vb.net入门——SaveFileDialog 组件的使用 (38次浏览)



