Public Declare Function SmsOpen Lib "SMS" (ByVal ptsMessageProtocol
  As String, ByVal dwMessageModes As Long, ByRef psmshHandle As
  Long, ByRef phMessageAvailableEvent As Long) As Long

Public Declare Function SmsSendMessage Lib "SMS" (ByVal smshHandle
  As Long, ByVal psmsaSMSCAddress As Long, ByVal
  psmsaDestinationAddress As String, ByVal pstValidityPeriod As
  Long, ByVal pbData As String, ByVal dwDataSize As Long, ByVal
  pbProviderSpecificData As String, ByVal dwProviderSpecificDataSize
  As Long, ByVal smsdeDataEncoding As Long, ByVal dwOptions As Long,
  ByRef psmsmidMessageID As Long) As Long

Public Declare Function SmsClose Lib "SMS" (ByVal smshHandle As Long) As Long


你也需要为不同的API声明一些API常数:

Public Const SMS_MSGTYPE_TEXT = "Microsoft Text SMS Protocol"
Public Const SMS_MODE_SEND = 2            '用发送模式打开
Public Const SMSDE_GSM = 1                '使用标准GSM
  encoding
Public Const SMSAT_INTERNATIONAL = 1      ' 国际号码
  format
Public Const PS_MESSAGE_OPTION_NONE = 0   ' 没有消息选项
Public Const PS_MESSAGE_CLASS0 = 0        ' 立即发送
Public Const PSRO_NONE = 0                '没有更替
Public Const SMS_OPTION_DELIVERY_NONE = 0 ' 没有发送选项


下面是发送SMS消息的完整代码:

Public Sub SendSMS(ByVal Number As String, ByVal Message As String)

  Dim SMSHandle As Long
  Dim SMSEvent As Long
  Dim SMSAddress As String
  Dim SMSProvider As String

  '打开SMS消息组件
  Call SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, SMSHandle, SMSEvent)

  '设置地址结构体
  SMSAddress = LongToBytes(SMSAT_INTERNATIONAL) & Number

  '设置提供者结构体
  SMSProvider = LongToBytes(PS_MESSAGE_OPTION_NONE) & _
                LongToBytes(PS_MESSAGE_CLASS0) & _
                LongToBytes(PSRO_NONE)

  '发送消息
  If 0 = SmsSendMessage(SMSHandle, 0, SMSAddress, 0, Message, _
         LenB(Message), SMSProvider, 12, SMSDE_GSM, _
         SMS_OPTION_DELIVERY_NONE, 0) Then
    MsgBox "Message sent!", vbInformation, App.Title
  Else
    MsgBox "Could not send message!", vbCritical, App.Title
  End If

  '关闭SMS消息组件
  Call SmsClose(SMSHandle)

End Sub




首先SMS消息组件被打开(SmsOpen),它的句柄被保存(SMSHandle)。调用SMS API时该句柄是必须的。

调用SmsSendMessage时需要一些结构体或者UDT(用户定义类型)。因为嵌入式Visual Basic缺乏对UDT的支持,简单字符串用于模拟结构体。

第一个是包含SMS消息地址的结构体。地址结构体包含支持的号码类型以及号码本身。下一个结构体是关于服务提供者的一些选项。该结构体的第一部分指示没有选择特定的项,第二部分显示消息必须立即发送,最后的部分规定不能替换。

在发送消息(SmsSendMessage)的调用中,提供了准备好的结构体、消息文本和一些选项。最后,句柄被关闭(SmsClose)。



结论

SMS对于短小及时的文本通知有很大用处。在Pocket PC 2002 Phone Edition的支持下,你可以使应用程序"SMS自唤醒"。使用例程的代码,大部分需要的操作完成了。如果你接受移动世界,按照通讯机制和协议,更多是使用"并且"而不是"或者",你能按需求使用任意选项。

相关文章: