频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

.NET Framework 精简版访问电话API

来源:Microsoft 作者: 出处:巧巧读书 2005-11-30 进入讨论组
上一页 1 2 3 
访问地址 http://www.qqread.com/dotnet/u652114000.html
使用VB.NET访问SIM信息

  初始类声明与 C# 中的声明相同:

Private Shared SERVICE_PROVIDER As Long = &H6F46

<StructLayout(LayoutKind.Sequential)> _
Public Structure SimRecord
Public cbSize As IntPtr
Public dwParams As IntPtr
Public dwRecordType As IntPtr
Public dwItemCount As IntPtr
Public dwSize As IntPtr
End Structure

<System.Runtime.InteropServices.DllImport("sms.dll")> _
Private Shared Function SmsGetPhoneNumber(ByVal psmsaAddress As IntPtr) As
IntPtr
End Function

<System.Runtime.InteropServices.DllImport("cellcore.dll")> _
Private Shared Function SimInitialize(ByVal dwFlags As IntPtr, ByVal
lpfnCallBack As IntPtr, ByVal dwParam As IntPtr, ByRef lphSim As IntPtr)
As IntPtr
End Function

<System.Runtime.InteropServices.DllImport("cellcore.dll")> _
Private Shared Function SimGetRecordInfo(ByVal hSim As IntPtr, ByVal
dwAddress As IntPtr, ByRef lpSimRecordInfo As SimRecord) As IntPtr
End Function

<System.Runtime.InteropServices.DllImport("cellcore.dll")> _
Private Shared Function SimReadRecord(ByVal hSim As IntPtr, ByVal
dwAddress As IntPtr, ByVal dwRecordType As IntPtr, _
ByVal dwIndex As IntPtr, ByVal lpData() As Byte, ByVal dwBufferSize As
IntPtr, ByRef lpdwBytesRead As IntPtr) As IntPtr
End Function

<System.Runtime.InteropServices.DllImport("cellcore.dll")> _
Private Shared Function SimDeinitialize(ByVal hSim As IntPtr) As IntPtr
End Function

GetPhoneNumber 函数相当于 C# 实现。首先创建缓冲区空间,并使用 P/Invoke 调用 SmsGetPhoneNumber 函数。

Dim phoneaddr As PhoneAddress = New PhoneAddress
Dim buffer(512) As Byte
Dim pAddr() As Byte = buffer
Dim ipAddr As IntPtr = Marshal.AllocHLocal(pAddr.Length)
Dim res As IntPtr = IntPtr.Zero

Try
res = SmsGetPhoneNumber(ipAddr)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

If (res.ToInt32 <> 0) Then
Throw New Exception("无法从 SIM 中获取电话号码")
End If

  然后从返回的结构中获取地址类型信息。

  phoneaddr.AddressType =
  System.Runtime.InteropServices.Marshal.ReadInt32(ipAddr)

  将返回的电话号码缓冲区转换为一个字符串,然后返回完整的 PhoneAddress 结构。

  GetServiceProvider 函数的情况也与 C# 版本中的情况非常相似。

Dim hSim, res As IntPtr
hSim = IntPtr.Zero
Dim temp As Long

res = SimInitialize(IntPtr.Zero, Nothing, IntPtr.Zero, hSim)
If (res.ToInt32 <> 0) Then
Throw New Exception("无法初始化 SIM。")
End If

  首先初始化 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
Dim dwBytesRead As IntPtr = IntPtr.Zero

res = SimReadRecord(hSim, IntPtr.op_Explicit(SERVICE_PROVIDER),
rec.dwRecordType, IntPtr.Zero, bData,
IntPtr.op_Explicit(bData.Length), dwBytesRead)
If (res.ToInt32 <> 0) Then
Throw New Exception("无法从 SMS 中读取服务提供程序。")
End If

  然后,正如在 C# 代码中执行的操作一样,必须从产生的字节缓冲区中删除任何非 ASCII 字符,然后转换为字符串并返回该字符串值。

Dim bScrubbed(dwBytesRead.ToInt32) As Byte
Dim nPos As Int32 = 0
Dim i As Int32

'删除非 ASCII 字符
For i = 0 To dwBytesRead.ToInt32
If bData(i) > 19 And bData(i) < 125 Then
bScrubbed(nPos) = bData(i)
nPos = nPos + 1
End If
Next i

SimDeinitialize(hSim)

Return System.Text.ASCIIEncoding.ASCII.GetString(bScrubbed, 0,
bScrubbed.Length)

  代码使用

  要使用 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新手入门.NET移动与嵌入式技术.NET开发手册专题,或进入讨论组讨论。
上一页 1 2 3 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章