科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用.NET智能版进行SIM编程

使用.NET智能版进行SIM编程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

学习如何使用SIM管理器API、.net智能版的Interop服务创建用于Pocket PC Phone的应用程序

作者:Gregor Noriskin 来源:微软 2007年11月4日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
SIM Anyplace 示例

  该示例是使用 Microsoft Visual Studio? .NET、C#、SDE 和 .NET CF 创建的 Pocket PC Phone 的示例应用程序。它展示了如何使用 SIM 管理器 API 访问 SIM 卡。该应用程序包含一个窗体:

  此示例的用途仅限于通过敲击“获取 SIM 信息”按钮从 SIM 卡获取一般信息。但是,通过使用此示例的结构可以将其用途扩展至包含更多的 SIM 管理器 API 功能。

  代码演练

  要使用 Compact Framework 的 Interop 服务,需要添加以下代码:

using System.Runtime.InteropServices;

  创建类 SIMWrap 来存储 Windows API 的原型,该示例需要以下原型:

[DllImport("cellcore.dll")]
public static extern int SimInitialize(uint dwFlags,
int lpfnCallBack, uint dwParam, ref int lphSim);

[DllImport("cellcore.dll")]
public static extern int SimGetPhonebookStatus(int hSim,
uint dwLocation, ref uint lpdwUsed, ref uint lpdwTotal);

[DllImport("cellcore.dll")]
public static extern int SimGetDevCaps(int hSim,
uint dwCapsType, ref SimCaps lpSimCaps);

[DllImport("cellcore.dll")]
public static extern int SimGetSmsStorageStatus(int hSim,
uint dwStorage, ref uint lpdwUsed, ref uint lpdwTotal );

[DllImport("cellcore.dll")]
public static extern int SimDeinitialize(int hSim);

  每个原型均具有一个指向 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();
int hSim = 0;
uint phoneUsed = 0;
uint phoneTotal = 0;
uint smsUsed = 0;
uint smsTotal = 0;

// 清空 ListView
lvwItems.Items.Clear();

// 启动 SIM 管理器会话(获取句柄)
SimWrap.SimInitialize(0, 0, 0, ref hSim);

// 获取电话簿状态(使用部分、全部)
SimWrap.SimGetPhonebookStatus(hSim, SimWrap.SIM_PBSTORAGE_SIM,
ref phoneUsed, ref phoneTotal);
AddToListView("Total phonebook size:", phoneTotal.ToString());
AddToListView("Phonebook entries:", phoneUsed.ToString());

// 获取 SIM 功能
SimWrap.SimGetDevCaps(hSim, SimWrap.SIM_CAPSTYPE_ALL, ref simCaps);
AddToListView("Max. length of name:",
simCaps.dwMaxPBETextLength.ToString());
AddToListView("Max. length of phone number:",
simCaps.dwMaxPBEAddressLength.ToString());

// 获取消息 (SMS) 状态(使用部分、全部)
SimWrap.SimGetSmsStorageStatus(hSim, SimWrap.SIM_SMSSTORAGE_SIM,
ref smsUsed, ref smsTotal);
AddToListView("SMS message storage capacity:", smsTotal.ToString());
AddToListView("SMS messages:", smsUsed.ToString());

// 结束 SIM 管理器会话
SimWrap.SimDeinitialize(hSim);

  清空 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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章