以前查找了好些在.net CF框架上调用设备本地API函数读取手机SIM卡的资料,但各种资料都少了些描述,特别是少了一些引用的结构(struct),造成了资料中的原代码不能直接运行,让很多学习的朋友遇到很多麻烦,花费了多余的时间,走了一些弯路。 我也遇到了类似的问题,通过补充了一些缺失的代码后,使程序可以正常的读取SIM卡了。      SIM 卡   Pocket PC Phone 的内置电话功能使它成为移动电话家族的重要成员,在创建新的连接应用程序时,可以利用该功能。与所有移动电话一样,Pocket PC 电话也需要用户身份模块 (SIM) 卡才能拨打电话(紧急电话除外,拨打紧急电话时无需 SIM 卡)。例如,连接应用程序可以通过在启动连接之前检查用户的个人识别码 (PIN) 代码来利用 SIM 卡的安全功能。   SIM 卡可以存储移动电话的电话号码以及提供此号码的操作员的身份标识。另外,它还可以存储附加有姓名的电话号码以及多条短消息服务的消息。SIM 卡不仅具有存储器,还具有使卡可以进行安全和加密处理的中央处理器。通常情况下,您需要使用 PIN 代码“登录”到 SIM 卡。   SIM 管理器 API   在 Pocket PC Phone 中,您可以使用一系列 Windows CE API 调用(统称为 SIM 管理器)来访问 SIM 卡上的信息。   会话以调用 SimInitialize 开始,这将返回一个 SIM 句柄,此后,在调用 SIM 管理器 API 函数时均需要此句柄。通过将此句柄传递给 SimDeinitialize 来终止会话。   使用 Compact Framework 调用 Windows API   使用 SDE (Smart Device Extensions) 和 Compact Framework,可以进行 Microsoft? Windows? API 调用,例如使用 Interop(erability) 服务访问 SIM 管理器 API。   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 的原型,该示例需要以下原型: 、

代码

public const int SIM_CAPSTYPE_ALL = 0x3F; // 所有联系人
public const int SIM_PBSTORAGE_SIM = 0x10; //
public const int SIM_SMSSTORAGE_SIM = 0x2; //

[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);

[DllImport("cellcore.dll")]
public static extern int SimReadPhonebookEntry(int hSim, uint dwLocation, uint dwIndex, ref SIMPHONEBOOKENTRY entry);

[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;
}

//很多文章都缺失的结构

[StructLayout(LayoutKind.Sequential)]
public struct SimLockingPwdLength
{
public uint dwFacility;
public uint dwPasswordLength;
}

//很多文章都缺失的结构

[StructLayout(LayoutKind.Sequential)]
public struct SIMPHONEBOOKENTRY
{
public uint cbSize; //
public uint dwParams; //
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string lpszAddress; // 联系人电话
public uint dwAddressType; //
public uint dwNumPlan; //
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string lpszText; // 联系人姓名
}

/// <summary>
/// 获取SIM卡联系人信息
/// </summary>
/// <returns></returns>
public static List<string[]> GetSIMContactList()
{
int hSim = 0;
List<string[]> list = new List<string[]>();
try
{
int result = SimInitialize(0, 0, 0, ref hSim);
if (result != 0)
throw new Exception("SIM打卡失败,请检测SIM是否安装!");
uint uiUsed = 0;
uint uiTotal = 0;
result = SimGetPhonebookStatus(hSim, SIM_PBSTORAGE_SIM, ref uiUsed, ref uiTotal);

for (int i = 1; i <= uiUsed; i++)
{
SIMPHONEBOOKENTRY entry = new SIMPHONEBOOKENTRY();
entry.cbSize = (uint)Marshal.SizeOf(typeof(SIMPHONEBOOKENTRY));
result = SimReadPhonebookEntry(hSim, SIM_PBSTORAGE_SIM, (uint)i, ref entry);
list.Add(new string[2] { entry.lpszText.Trim(), entry.lpszAddress.Trim() });
}
return list;

}
catch
{
throw;
}
finally
{
SimDeinitialize(hSim);

}
}

声明适当时,“获取 SIM 信息”按钮所表示的代码如下所示: dataGrid1为列表控件

代码

List<string[]> list = SIMWrap.GetSIMContactList();
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("姓名", typeof(string)));
dt.Columns.Add(new DataColumn("号码", typeof(string)));

string[] str;
for(int i = 0; i < list.Count; i++)
{
str = list[i];
DataRow dr = dt.NewRow();
dr[0] = str[0].ToString();
dr[1] = str[1].ToString();
dt.Rows.Add(dr);

}

dataGrid1.DataSource = dt;

小结   由于 Pocket PC Phone 是移动电话家族的重要成员,因此在创建大型的连接应用程序时可以利用其功能,例如 SIM 卡。使用 SIM 管理器 API、Compact Framework 的 Interop 服务以及 .NET 开发环境,可以获得实现这一功能的工具。

转载于:https://www.cnblogs.com/Wolves/archive/2010/12/03/1895533.html

从MS .NET CF版访问电话API(完整版) (转载)相关推荐

  1. 计算机操作系统英文版课后答案,计算机操作系统(第3版)课后习题答案(完整版)...

    内容简介: 计算机操作系统(第3版)课后习题答案(完整版) 第一章 1.设计现代OS的主要目标是什么? 答:(1)有效性 (2)方便性 (3)可扩充性 (4)开放性 2.OS的作用可表现在哪几个方面? ...

  2. 2022冬季版凯立德完整版

    这2022冬季版凯立德完整版 2022年凯立德移动导航系统C-Car版 2022年凯立德移动导航系统C-Car版 2022冬季版凯立德完整版 链接:https://pan.baidu.com/s/1X ...

  3. 材料力学c语言程序,材料力学(I)五版课后习题答案完整版.pdf

    材料力学(I)五版课后习题答案完整版 第二章 轴向拉伸和压缩 第二章 轴向拉伸和压缩 第第二二章章 轴轴向向拉拉伸伸和和压压缩缩 2-1 试求图示各杆1-1和2-2横截面上的轴力,并作轴力图. 解 解 ...

  4. CDH5.15离线搭建简易版集群(完整版)

    运用CDH5.15离线搭建简易版集群 关于CDH和Cloudera CDH(Cloudera的发行版,包括Apache Hadoop),是Hadoop众多分支中的一种,由Cloudera维护,基于稳定 ...

  5. python快速入门第三版-Python 快速入门:第3版 配套资源 PDF 完整版

    给大家带来的一篇关于Python入门相关的电子文档资源,介绍了关于Python.快速入门方面的内容,本书是由Python官网出版,格式为PDF,资源大小23 MB,码小辫编写,目前豆瓣.亚马逊.当当. ...

  6. 03版计算机,office2003完整版电脑版

    office2003完整版电脑版是office系列最实用的一个版本,这个版本的软件的功能非常的丰富,运行速度不仅快而且稳定,兼容性还是所有版本中最强的,非常的适合办公人员使用. office2003完 ...

  7. [Java] 超简图床(Java版) —— 专为Api而生

    v1.2已更新,添加新浪图床v1.1已更新,支持保存配置,配置不会随着服务器重启而被重置 PHP版本请看这里:https://www.52pojie.cn/forum.php?mod=viewthre ...

  8. Android 天气APP(三)访问天气API与数据请求

    上一篇:Android 天气APP(二)获取定位信息 访问天气API与数据请求 新版------------------- 一.和风天气 二.城市搜索接口 三.OKHttp使用 四.文章源码 旧版-- ...

  9. 关于Struts2三种访问Servlet API方式的总结

    在开发j2ee过程中,通常我们需要访问的Servlet API是:HttpSession,HttpservletRequest,ServletContext,这三者分别对应于JSP的内置对象:sess ...

最新文章

  1. Numpy Axis
  2. 前端开发技术-剖析JavaScript单线程
  3. php strstr 效率,PHP中的stristr(),strstr(),strpos()速度比较
  4. Tcp连接的七次握手浅析
  5. 为Eclipse安装功能扩展插件
  6. 数据结构开发(6):静态单链表的实现
  7. SpringBoot配置多Redis数据源
  8. win11升级不满足最低系统要求怎么办 windows11升级不满足最低系统要求的解决方法
  9. 二相四线制步进电机驱动原理与Proteus仿真
  10. hdoj1465错排公式的应用(递推)
  11. python的计算_基于python实现的计算器
  12. 计算机关闭445端口,如何关闭445端口 win7/win10关闭445端口的方法图解
  13. 读书笔记 摘自:《智能商业》
  14. 基于Android的办公自动化系统APP设计与实现
  15. 微软打击盗版的“三部曲”
  16. 陈式太极拳式名考释、动作、着法要领说明
  17. oracle经常考的题型是哪些,Oracle考试试题(带答案).doc
  18. AirTest Poco定位 和启动方式
  19. matlab实现手绘风格(简笔画风格、漫画风格)的曲线绘图
  20. 蒙特卡洛方法的收敛性和误差

热门文章

  1. sqoop把mysql数据导入hive
  2. SVM基本思想及入门学习(转载+自己解释为什么minL(w)变成minmaxL(a,w))
  3. 删除右键文件下拉菜单(非打开方式)中的wine选项
  4. tensorflow学习笔记:tf.control_dependencies,tf.GraphKeys.UPDATE_OPS,tf.get_collection
  5. go 用 mysql web开发环境_简单讲解Go程序中使用MySQL的方法
  6. Chrome的vimium插件的使用笔记
  7. 自定义队列(优化了数组固定长度的弊端)以及集合中的一些重点内容
  8. 手把手教你查看android系统源码
  9. 如何对依赖ZooKeeper的代码写单元测试
  10. 【全记录】2017云栖大会·北京峰会——企业云上业务优化专场