3892|6

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

写一个短信收发程序的问题 [复制链接]

我想在CE6.0下有SMS API写一个短信收发的程序。
现在当收到有一条新短信的消息后,就调smsReadMessage去读,但每次都返回(120,系统不支持)这个错误。
参数大概是这样设置的:
HRESULT SmsReadMessage (
  const SMS_HANDLE smshHandle,   //smsOpen返回的句柄
  SMS_ADDRESS* const psmsaSMSCAddress,  //smsGetSMSC
  SMS_ADDRESS* const psmsaSourceAddress,   //smsSourceAddr = {SMSAT_UNKNOWN, L"13612345678"};
  SYSTEMTIME* const pstReceiveTime,  //这个我用smsGetTime它也返回120这个错误 我就没给值了,直接把变量传进去。
  __out_bcount(dwBufferSize) BYTE* const pbBuffer,  //给一个BUF 大小用smsGetMessageSize获得
  DWORD dwBufferSize,  //大小用smsGetMessageSize获得
  __out_bcount(dwProviderSpecificDataBuffer) BYTE* const pbProviderSpecificBuffer,  //直接给个BUF
  DWORD dwProviderSpecificDataBuffer,  //BUF 大小
  DWORD* pdwBytesRead  //直接给个变量地址,它应该是往里面写值
);

麻烦大侠们帮我看一下错在哪里,给个这个函数怎么设值的例子也行。

最新回复

谢谢, 这个问题解决了,是我没有设置pbProviderSpecificBuffer。   详情 回复 发表于 2009-5-11 17:00
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
驱动上都实现了么?
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
RIL层的支持都实现了吗?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
不管RIL 实现了。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
如果RIL已经实现的前提下,我这里给你一个简单的例子。

  1. // 短信发送的例子
  2. #include "StdAfx.h"
  3. #include

  4. #pragma comment (lib, "sms.lib")

  5. int WINAPI WinMain (HINSTANCE hInstance,
  6.                     HINSTANCE hPreviousInstance,
  7.                     LPWSTR pszCommandLine,
  8.                     int nCommandShow)
  9. {
  10.         SMS_HANDLE smshHandle;
  11.         SMS_ADDRESS smsaCenter;
  12.         SMS_ADDRESS smsaDestination;
  13.         TEXT_PROVIDER_SPECIFIC_DATA tpsd;
  14.         SMS_MESSAGE_ID smsmidMessageID;

  15.         TCHAR num[] = TEXT("+8613800138000");    // 短信目的地
  16.         LPTSTR lpszDestination = num;

  17.         TCHAR source[] = TEXT("+8613800755500");  // 短信中心
  18.         LPTSTR lpszSMSCenter = source;

  19.         TCHAR text[] = TEXT("黑心的CMCC~!");  // 中英文全角半角字符
  20.         LPTSTR lpszMessage = text;

  21.         HRESULT hRet = 0;


  22.         // 打开 SMS Handle
  23.         hRet = SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL);

  24.         if(FAILED(hRet))
  25.         {
  26.                 return FALSE;
  27.         }
  28.         hRet = SmsGetSMSC(&smsaCenter);

  29.         // 设置 SMS Center
  30.         smsaCenter.smsatAddressType = SMSAT_INTERNATIONAL;
  31.         _tcsncpy(smsaCenter.ptsAddress, lpszSMSCenter, SMS_MAX_ADDRESS_LENGTH);

  32.         hRet = SmsSetSMSC(&smsaCenter);

  33.         // 创建 destination address
  34.         smsaDestination.smsatAddressType = SMSAT_INTERNATIONAL;
  35.         _tcsncpy(smsaDestination.ptsAddress, lpszDestination, SMS_MAX_ADDRESS_LENGTH);

  36.         // 设置 provider specific data
  37.         memset(&tpsd, 0, sizeof(tpsd));
  38.         tpsd.dwMessageOptions = PS_MESSAGE_OPTION_NONE;
  39.         tpsd.psMessageClass = PS_MESSAGE_CLASS1;
  40.         tpsd.psReplaceOption = PSRO_NONE;
  41.         tpsd.dwHeaderDataSize = 0;

  42.         // 发送短信
  43.         hRet = SmsSendMessage(
  44.                 smshHandle,
  45.                 NULL,
  46.                 &smsaDestination,
  47.                 NULL,
  48.                 (PBYTE) lpszMessage,
  49.                 _tcslen(lpszMessage) * sizeof(TCHAR),
  50.                 (PBYTE) &tpsd,
  51.                 sizeof(TEXT_PROVIDER_SPECIFIC_DATA),
  52.                 SMSDE_OPTIMAL,
  53.                 SMS_OPTION_DELIVERY_NONE,
  54.                 &smsmidMessageID
  55.                 );

  56.         if (smshHandle != NULL)
  57.         {
  58.                 SmsClose(smshHandle);
  59.                 SmsClose(smshRecieveHandle);
  60.                 smshHandle = NULL;
  61.         }

  62.         return TRUE;
  63. }
复制代码
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个是短信接收的例子:


  1. #include "StdAfx.h"
  2. #include

  3. #pragma comment (lib, "sms.lib")

  4. int WINAPI WinMain (HINSTANCE hInstance,
  5.                     HINSTANCE hPreviousInstance,
  6.                     LPWSTR pszCommandLine,
  7.                     int nCommandShow)
  8. {
  9.         SMS_HANDLE smshHandle = 0;
  10.         SMS_MESSAGE_ID smsmidMessageID = 0;

  11.         HRESULT hRet = 0;

  12.         SMS_HANDLE smshRecieveHandle;
  13.         DWORD dwReturn = 0;
  14.         HANDLE hSmsEvent;
  15.         dwReturn = SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_RECEIVE, &smshRecieveHandle, &hSmsEvent);
  16.         
  17.         // 程序会在此等待模块来短信,直到超时或者有短信来到
  18.         dwReturn = WaitForSingleObject(hSmsEvent, INFINITE);

  19.         // 判断是否成功接收到短信
  20.         if(dwReturn == WAIT_ABANDONED || dwReturn == WAIT_TIMEOUT)
  21.         {
  22.                 return FALSE;
  23.         }

  24.         // 成功接收到短信,先设置好短信大小
  25.         DWORD dwMessageSize = 1024;


  26.         // 初始化短信结构
  27.         SMS_ADDRESS smscAddress;
  28.         SMS_ADDRESS inAddress;
  29.         SYSTEMTIME rcvTime;
  30.         TEXT_PROVIDER_SPECIFIC_DATA txtProviderData;
  31.         DWORD dwProviderLength = 0;

  32.         dwProviderLength = sizeof(TEXT_PROVIDER_SPECIFIC_DATA);
  33.         memset(&txtProviderData, 0, dwProviderLength);

  34.         memset(&smscAddress, 0, sizeof(SMS_ADDRESS));
  35.         memset(&inAddress, 0, sizeof(SMS_ADDRESS));
  36.         memset(&rcvTime, 0, sizeof(SYSTEMTIME));

  37.         // 创建一个buffer来存放短信
  38.         TCHAR *tchMsgBuffer = NULL;
  39.         tchMsgBuffer = (TCHAR *)LocalAlloc(LPTR,
  40.                 dwMessageSize*sizeof(TCHAR));
  41.         if(!tchMsgBuffer)
  42.         {
  43.                 SmsClose(smshHandle);
  44.                 SmsClose(smshRecieveHandle);
  45.                 return FALSE;
  46.         }

  47.         // 把短信从模块里读出来放到buffer里,执行完以后,tchMsgBuffer里存放的就是接收到短信的UNICODE编码
  48.         DWORD dwBytesRead = 0;
  49.         hRet = SmsReadMessage(
  50.                 smshRecieveHandle,
  51.                 &smscAddress,
  52.                 &inAddress,
  53.                 &rcvTime,
  54.                 (LPBYTE)tchMsgBuffer,
  55.                 dwMessageSize,
  56.                 (LPBYTE)&txtProviderData,
  57.                 dwProviderLength,
  58.                 &dwBytesRead
  59.                 );

  60.         if(FAILED(hRet))
  61.         {
  62.                 LocalFree(tchMsgBuffer);
  63.                 tchMsgBuffer = NULL;
  64.                 SmsClose(smshHandle);
  65.                 SmsClose(smshRecieveHandle);
  66.                 return FALSE;
  67.         }

  68.         if (smshHandle != NULL)
  69.         {
  70.                 SmsClose(smshHandle);
  71.                 SmsClose(smshRecieveHandle);
  72.                 smshHandle = NULL;
  73.         }

  74.         return TRUE;
  75. }

复制代码
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢, 这个问题解决了,是我没有设置pbProviderSpecificBuffer。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表