Windows mobile 下读取手机SIM卡信息 c#改善

参考网上有其他写的c#代码有点问题。

添加部分,测试真机环境mobile 6.1

原网址:http://www.watch-life.net/windows-mobile/windows-mobile-sim.html

public struct GeneralInfo

{

public string Manufacturer;

public string Model;

public string Revision;

public string SerialNumber;

public string SubscriberNumber;

}

/// <summary>

/// Tapi控制类

/// </summary>

public class ControlTapi

{

[DllImport( "cellcore.dll" )]

private static extern int lineGetGeneralInfo( IntPtr hLigne , byte[] lpLineGeneralInfo );

/// <summary>

/// 调用cellcore.dll获取sim卡的综合信息

/// </summary>

/// <param name="l"></param>

/// <returns></returns>

private GeneralInfo GetGeneralInfo( Line l )

{

GeneralInfo lgi = new GeneralInfo( );

byte[] buffer = new byte[512];

BitConverter.GetBytes( 512 ).CopyTo( buffer , 0 );

if ( lineGetGeneralInfo( l.hLine , buffer ) != 0 )

{

throw new System.ComponentModel.Win32Exception( System.Runtime.InteropServices.Marshal.GetLastWin32Error( ) , "TAPI Error: " + System.Runtime.InteropServices.Marshal.GetLastWin32Error( ).ToString( "X" ) );

}

int manusize = BitConverter.ToInt32(buffer, 12);

int manuoffset = BitConverter.ToInt32(buffer, 16);

lgi.Manufacturer = System.Text.Encoding.Unicode.GetString(buffer, manuoffset, manusize);

lgi.Manufacturer = lgi.Manufacturer.Substring( 0 , lgi.Manufacturer.IndexOf( Convert.ToChar( 0 ) ) );

int modelsize = BitConverter.ToInt32(buffer, 20);

int modeloffset = BitConverter.ToInt32(buffer, 24);

lgi.Model = System.Text.Encoding.Unicode.GetString(buffer, modeloffset, modelsize);

lgi.Model = lgi.Model.Substring(0, lgi.Model.IndexOf(Convert.ToChar(0)));

int revsize = BitConverter.ToInt32(buffer, 28);

int revoffset = BitConverter.ToInt32(buffer, 32);

lgi.Revision = System.Text.Encoding.Unicode.GetString(buffer, revoffset, revsize);

lgi.Revision = lgi.Revision.Substring( 0 , lgi.Revision.IndexOf( Convert.ToChar( 0 ) ) );

int serialsize = BitConverter.ToInt32(buffer, 36);

int serialoffset = BitConverter.ToInt32(buffer, 40);

lgi.SerialNumber = System.Text.Encoding.Unicode.GetString(buffer, serialoffset, serialsize);

lgi.SerialNumber = lgi.SerialNumber.Substring( 0 , lgi.SerialNumber.IndexOf( Convert.ToChar( 0 ) ) );

int subscsize = BitConverter.ToInt32( buffer , 44 );

int subscoffset = BitConverter.ToInt32( buffer , 48 );

lgi.SubscriberNumber = System.Text.Encoding.Unicode.GetString( buffer , subscoffset , subscsize ).ToString( );

lgi.SubscriberNumber = lgi.SubscriberNumber.Replace( "\0" , "" );

return lgi;

}

/// <summary>

/// 获取sim卡的IMSI

/// </summary>

/// <returns></returns>

public static string GetIMSINumber( )

{

string result = "";

try

{

Tapi t = new Tapi( );

t.Initialize( );

Line l = t.CreateLine( 0 , LINEMEDIAMODE.INTERACTIVEVOICE , OpenNETCF.Tapi.LINECALLPRIVILEGE.MONITOR );

ControlTapi ctapi = new ControlTapi( );

GeneralInfo gi = ctapi.GetGeneralInfo( l );

result = gi.SubscriberNumber;

l.Dispose( );

t.Shutdown( );

}

catch// (Exception ex)

{

result = "";

}

return result;

}

/// <summary>

/// 获取IMEI的号码

/// </summary>

/// <returns></returns>

public static string GetIMEINumber( )

{

string result = "";

try

{

Tapi t = new Tapi( );

t.Initialize( );

Line l = t.CreateLine( 0 , LINEMEDIAMODE.INTERACTIVEVOICE , OpenNETCF.Tapi.LINECALLPRIVILEGE.MONITOR );

ControlTapi ctapi = new ControlTapi( );

GeneralInfo gi = ctapi.GetGeneralInfo( l );

result = gi.SerialNumber;

l.Dispose( );

t.Shutdown( );

}

catch// (Exception ex)

{

result = "";

}

return result;

}

}