扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Gregor Noriskin 来源:微软 2007年11月4日
关键字:
此示例的用途仅限于通过敲击“获取 SIM 信息”按钮从 SIM 卡获取一般信息。但是,通过使用此示例的结构可以将其用途扩展至包含更多的 SIM 管理器 API 功能。
代码演练
要使用 Compact Framework 的 Interop 服务,需要添加以下代码:
using System.Runtime.InteropServices; |
创建类 SIMWrap 来存储 Windows API 的原型,该示例需要以下原型:
[DllImport("cellcore.dll")] [DllImport("cellcore.dll")] [DllImport("cellcore.dll")] [DllImport("cellcore.dll")] [DllImport("cellcore.dll")] |
每个原型均具有一个指向 DLL(动态链接库,在其中执行函数)的 DllImport 属性,在本例中为 cellcore.dll。创建这些原型时,Visual Studio .NET 帮助文件提供了一个包含类型映射的极好表格(请在索引中查找“平台调用”和“数据类型”)。例如,本地类型“DWORD”映射到管理类型“UInt32”,UInt32 为 C# 中的一个“单位”。
用于获取 SIM 卡功能的调用 (SimGetDevCaps) 包含一个由引用 (lpSimCaps) 作为最后参数传递的结构。本地 (C++) 结构如下所示:
typedef struct simcaps_tag { DWORD cbSize; DWORD dwParams; DWORD dwPBStorages; DWORD dwMinPBIndex; DWORD dwMaxPBIndex; DWORD dwMaxPBEAddressLength; DWORD dwMaxPBETextLength; DWORD dwLockFacilities; DWORD dwReadMsgStorages; DWORD dwWriteMsgStorages; DWORD dwNumLockingPwdLengths; SIMLOCKINGPWDLENGTH rgLockingPwdLengths[SIM_NUMLOCKFACILITIES]; } SIMCAPS, FAR *LPSIMCAPS; |
当 SIM_NUMLOCKFACILITIES 等于 10 时,相同结构的 Compact Framework 版本如下所示:
[StructLayout(LayoutKind.Sequential)] public struct SimCaps { public uint cbSize; public uint dwParams; public uint dwPBStorages; public uint dwMinPBIndex; public uint dwMaxPBIndex; public uint dwMaxPBEAddressLength; public uint dwMaxPBETextLength; public uint dwLockFacilities; public uint dwReadMsgStorages; public uint dwWriteMsgStorages; public uint dwNumLockingPwdLengths; public SimLockingPwdLength rgLockingPwdLengths0; public SimLockingPwdLength rgLockingPwdLengths1; public SimLockingPwdLength rgLockingPwdLengths2; public SimLockingPwdLength rgLockingPwdLengths3; public SimLockingPwdLength rgLockingPwdLengths4; public SimLockingPwdLength rgLockingPwdLengths5; public SimLockingPwdLength rgLockingPwdLengths6; public SimLockingPwdLength rgLockingPwdLengths7; public SimLockingPwdLength rgLockingPwdLengths8; public SimLockingPwdLength rgLockingPwdLengths9; } |
请注意,即使 MarchalAsAttribute 类在 Compact Framework (Beta 1) 中不受支持,通过使用附加后缀 (0-9) 将阵列添加为成员几乎可以实现相同的结构。实际上,这些成员属于另一种结构 (SimLockingPwdLength)。
声明适当时,“获取 SIM 信息”按钮所表示的代码如下所示:
SimWrap.SimCaps simCaps = new SimWrap.SimCaps(); // 清空 ListView // 启动 SIM 管理器会话(获取句柄) // 获取电话簿状态(使用部分、全部) // 获取 SIM 功能 // 获取消息 (SMS) 状态(使用部分、全部) // 结束 SIM 管理器会话 |
清空 ListView 且检索 (SimInitialize) 到 SIM 管理器句柄 (hSim) 后,将调用 SIM Wrapper 类 (SimWrap) 上的每个静态方法,从而产生 API 调用。作为引用传递的变量将获取返回值,并使用代码将其添加至 ListView 中。
private void AddToListView(string Item, string Value) { ListViewItem lvi = new ListViewItem(Item); lvi.SubItems.Add(Value); lvwItems.Items.Add(lvi); } |
最后,在调用 SimDeinitialize 时将释放 SIM 管理器句柄 (hSim)。
小结
由于 Pocket PC Phone 是移动电话家族的重要成员,因此在创建大型的连接应用程序时可以利用其功能,例如 SIM 卡。使用 SIM 管理器 API、Compact Framework 的 Interop 服务以及 .NET 开发环境,可以获得实现这一功能的工具。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者