WindowsMobileで、SIMの電話番号を取得する (VB.net)

いつも、くだらないことしか書いてないですが、たまには、まじめにプログラムネタを

自分でも忘れてしまいそうなので、備忘録をかねて掲載します。

知人から、WindowsMobileの電話端末用の、業務用ソフトの開発依頼をいただいたのですが、要求として、特定のユーザーだけを限定して動作するように、プロテクトをかけてほしいというものでした。

方法としては、端末固有のIMEIを取得するなどが考えられましたが、今回はSIMカードの電話番号で縛ることにしました。そのため、SIMの電話番号を取得するプログラム(メソッド)を作ってみました。

SIMや電話を操作するAPIの説明が、なかなか見つけられませんでしたが、USのMSDNサイトでサンプルを見つけることができましたので、そのサンプルを参考にしました。Phone.dllや、SMS.dllには、電話をかけたり、オペレーター(電話会社名)を表示させたり、SIMのメモリを読み書きするなどのファンクションも用意されてます。今回は、電話番号を取得することのみに絞っております。

3GのSIMカードを使っている機種であれば、ほとんど使えると思います。

WM6 Professional と WM6 Standard の両方で動作確認しております。

なお、WillcomのW-ZERO3では、Phone.dllとSMS.dllがないため、動作しません。おそらくSIMの仕様や、電話機能の仕様が違うのではないかと思われます。(詳しくは調べていません)

以下、ソースです。Webの表示上、改行して見えるところがありますので、ご注意ください。

VisualStudio2008のVB.netで作成しております。以下のソースを、Sim.vbをいうファイルにして追加し、メインモジュールからは、Sim.GetPhoneNumber() で呼び出せます

返値は、電話番号を文字列で返します。SIMが刺さってないとか、読みだせない場合は、”Nothing”(0文字)が返ります。

----------------------------------------------------------

Imports System.Runtime.InteropServices
Imports interopserv = System.Runtime.InteropServices
Imports System
Imports System.ComponentModel


Public Enum SMS_ADDRESS_TYPE
    SMSAT_UNKNOWN = 0
    SMSAT_INTERNATIONAL
    SMSAT_NATIONAL
    SMSAT_NETWORKSPECIFIC
    SMSAT_SUBSCRIBER
    SMSAT_ALPHANUMERIC
    SMSAT_ABBREVIATED
End Enum 'SMS_ADDRESS_TYPE

Public Structure PhoneAddress 
      Public AddressType As SMS_ADDRESS_TYPE 
       Public Address() As Char
End Structure

Class Sim
    Private Class WinApi

        Public Const LMEM_FIXED As Long = 0
        Public Const LMEM_MOVEABLE As Long = 2
        Public Const LMEM_ZEROINIT As Long = &H40
        Public Const LPTR As Long = LMEM_FIXED Or LMEM_ZEROINIT


        <System.Runtime.InteropServices.DllImport("coredll.dll", SetLastError:=True)> _
        Public Shared Function LocalAlloc(ByVal uFlags As System.Int32, ByVal uBytes As System.Int32) As IntPtr
        End Function

    End Class

    Public Shared Function AllocHLocal(ByVal cb As Int32) As IntPtr
        Try
            Return WinApi.LocalAlloc(WinApi.LPTR, cb)
        Catch ex As Exception
        End Try
    End Function


    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


    ' Gets the phone number from the SIM.
    Public Shared Function GetPhoneNumber() As String
        Dim phoneaddr As PhoneAddress = New PhoneAddress
        Dim buffer(512) As Byte
        Dim pAddr() As Byte = buffer
        Dim ipAddr As IntPtr = 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
            Return Nothing
        End If

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

        ipAddr = IntPtr.op_Explicit(System.Runtime.InteropServices.Marshal.SizeOf(phoneaddr.AddressType) + ipAddr.ToInt32)
        phoneaddr.Address = System.Runtime.InteropServices.Marshal.PtrToStringUni(ipAddr)

        Return phoneaddr.Address
    End Function


End Class

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。