WINCE及MOBILE常用代码(转)

WINCE及MOBILE常用代码(转)
2010年06月05日
  对话框全屏代码 -----在OnInitDialog函数中加入以下代码
  m_bFullScreen = FALSE;
  // Call SHInitDialog with flags for full screen.
  SHINITDLGINFO shidi;
  shidi.dwMask = SHIDIM_FLAGS;
  shidi.dwFlags = SHIDIF_FULLSCREENNOMENUBAR;
  shidi.hDlg = m_hWnd;
  SHInitDialog(&shidi);
  // SHFullScreen fails if dialog box is not foreground.
  SetForegroundWindow();
  SHFullScreen(m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON|SHFS_HIDESTARTICON);
  // Resize the window over the taskbar area.
  nX = GetSystemMetrics(SM_CXSCREEN);
  nY = GetSystemMetrics(SM_CYSCREEN); MoveWindow(0,0,nX,nY, TRUE);
  调用输入法面板:SHSipPreference(AfxGetMainWnd()->m_hWnd, SIP_UP); //SipShowIM(SIPF_ON);
  隐藏输入法面板:SHSipPreference(AfxGetMainWnd()->m_hWnd, SIP_DOWN); //SipShowIM(SIPF_OFF);
  /隐藏窗口右上角的OK按钮和X按钮
  ModifyStyleEx(WS_EX_CAPTIONOKBTN,WS_EX_TOPMOST,SWP _NOMOVE);//窗口右上角的OK按钮改为X按钮
  ModifyStyle(0, WS_NONAVDONEBUTTON, SWP_NOSIZE); //将X按钮隐藏
  使用unload.exe卸载程序
  PROCESS_INFORMATION stProgressInfo;
  CreateProcess(_T("\\Windows\\unload.exe"), szUninstallBuf, NULL, NULL, NULL, 0, NULL, NULL, NULL, &stProgressInfo) ;
  szUninstallBuf这个参数必须和注册表 HLM\SOFTWARE\APPS\下的对应应用的名称一致。
  有个前提,使用这个必须是在cab中没有指定 nouninstall这个参数
  /*
  #define EWX_LOGOFF 0
  #define EWX_SHUTDOWN 1
  #define EWX_REBOOT 2 重启
  #define EWX_FORCE 4
  #define EWX_POWEROFF 8 关机
  */
  extern "C" BOOL ExitWindowsEx(UINT uFlags, DWORD dwReason);
  ExitWindowsEx(EWX_REBOOT, 0); //重启(软重启)
  ExitWindowsEx(EWX_POWEROFF, 0); //关机
  显示或者隐藏等待图标
  // Set the cursor as the wait cursor.
  SetCursor (LoadCursor (NULL, IDC_WAIT));
  // Hide the cursor.
  SetCursor (0);
  //获取当前剩余物理内存:
  #include
  MEMORYSTATUS Status;
  Status.dwLength = sizeof(MEMORYSTATUS);
  GlobalMemoryStatus(&Status);
  //return Status.dwAvailPhys;
  获取电池电量剩余百分比:
  SYSTEM_POWER_STATUS_EX stat;
  GetSystemPowerStatusEx(&stat, TRUE);
  if (stat.BatteryLifePercent > 100)
  return -1;
  else
  return stat.BatteryLifePercent;
  获取磁盘剩余空间:
  GetDiskFreeSpaceEx(NULL,
  (PULARGE_INTEGER)&i64FreeBytesToCaller,
  (PULARGE_INTEGER)&i64TotalBytes,
  (PULARGE_INTEGER)&i64FreeBytes);
  通过GPRS连接WAP的代码:
  HANDLE m_hConnection;
  // 得到正确的连接信息
  CONNMGR_DESTINATION_INFO networkDestInfo = {0};
  // 得到网络列表
  DWORD dwEnumIndex=0;
  for (; ; dwEnumIndex++ )
  {
  memset ( &networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );
  if ( ConnMgrEnumDestinations ( dwEnumIndex, &networkDestInfo ) == E_FAIL )
  break;
  if(!_tcscmp(networkDestInfo.szDescription, _T("WAP")))
  break;
  }
  CONNMGR_DESTINATION_INFO DestInfo = {0};
  HRESULT hResult = ConnMgrEnumDestinations(dwEnumIndex, &DestInfo);
  BOOL bRet = FALSE;
  if(SUCCEEDED(hResult))
  {
  // 初始化连接结构
  CONNMGR_CONNECTIONINFO ConnInfo;
  ZeroMemory(&ConnInfo, sizeof(ConnInfo));
  ConnInfo.cbSize = sizeof(ConnInfo);
  ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
  ConnInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP | CONNMGR_FLAG_PROXY_WAP | CONNMGR_FLAG_PROXY_SOCKS4 | CONNMGR_FLAG_PROXY_SOCKS5;
  ConnInfo.dwPriority = CONNMGR_PRIORITY_HIPRIBKGND;//CONNMGR_PRIORITY_USERINTERACTIVE;
  ConnInfo.guidDestNet = /*IID_DestNetInternet*/DestInfo.guid;
  ConnInfo.bExclusive = FALSE;
  ConnInfo.bDisabled = FALSE;
  DWORD dwStatus = 0;
  hResult = ConnMgrEstablishConnectionSync(&ConnInfo, &m_hConnection, 100*1000, &dwStatus );
  DWORD err = GetLastError();
  if (SUCCEEDED(hResult))
  {
  //MessageBox(NULL,L"网络连接成功",L"信息",MB_OK);
  return TRUE;
  }
  else
  {
  //MessageBox(NULL,L"网络连接失败!!请检查网络状况。",L"错误",MB_OK);
  return FALSE;
  }
  }
  下面是封装的一个socket类,可用在wince和wm上 1 // TCPClient_CE.h: interface for the CTCPClient_CE class.
  2 //
  3 //
  4
  5 #if !defined(AFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9B A3_96152245C65E__INCLUDED_)
  6 #define AFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9BA3_961522 45C65E__INCLUDED_
  7
  8 #if _MSC_VER > 1000
  9 #pragma once
  10 #endif // _MSC_VER > 1000
  11
  12 #include
  13 #include "yourProject.h"
  14
  15
  16 //定义连接断开事件
  17 typedef void (CALLBACK* ONDISCONNECT)(CWnd*);
  18 //定义当有数据接收事件
  19 typedef void (CALLBACK* ONREAD)(CWnd*,const char * buf,int len );
  20 //定义Socket错误事件
  21 typedef void (CALLBACK* ONERROR)(CWnd*,int nErrorCode);
  22
  23 class CTCPClient_CE
  24 {
  25 public:
  26 CTCPClient_CE();
  27 virtual ~CTCPClient_CE();
  28 public:
  29 friend class YourApp;
  30 //打开客户端socket
  31 bool Open(CWnd * pWnd);
  32 //关闭客户端socket
  33 bool Close();
  34 //与服务器端建立连接
  35 bool Connect();
  36 //向服务器端发送数据
  37 bool SendDate(const char * buf , int len);
  38 bool SendData(const char * buf , int len);
  39 public:
  40 //远程主机IP地址
  41 CString m_remoteHost;
  42 //远程主机端口
  43 int m_port;
  44
  45 /*--以下客户端通讯事件--*/
  46 //连接断开事件,回调函数
  47 ONDISCONNECT OnDisConnect;
  48 //接收数据事件,回调函数
  49 ONREAD OnRead;
  50 //发生错误事件,回调函数
  51 ONERROR OnError;
  52 HANDLE m_hSynMutex; //同步互斥句柄
  53 private:
  54 //通讯Socket句柄
  55 SOCKET m_socket;
  56 //通讯线程退出事件句柄
  57 HANDLE m_exitThreadEvent;
  58 //通讯线程句柄
  59 HANDLE m_tcpThreadHandle;
  60 //父窗口句柄
  61 CWnd * m_pOwnerWnd;
  62 private:
  63 //通讯线程函数
  64 static DWORD SocketThreadFunc(LPVOID lparam);
  65 };
  66
  67 #endif // !defined(AFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9B A3_96152245C65E__INCLUDED_)
  68
  // TCPClient_CE.cpp: implementation of the CTCPClient_CE class.
  //
  //
  #include "stdafx.h"
  #include "yourProject.h"
  #include "TCPClient_CE.h"
  #ifdef _DEBUG
  #undef THIS_FILE
  static char THIS_FILE[]=__FILE__;
  #define new DEBUG_NEW
  #endif
  //
  // Construction/Destruction
  //
  //构造函数
  CTCPClient_CE::CTCPClient_CE()
  {
  INT iRet = 0;
  //初始化socket环境
  WSADATA wsd;
  iRet = WSAStartup(MAKEWORD(2,2),&wsd);
  int nNetTimeout=1000;//1秒
  //创建互斥对象,默认状态为"未被线程拥有"
  m_hSynMutex = CreateMutex(NULL,FALSE,NULL);
  //创建线程退出事件句柄
  m_exitThreadEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
  }
  //析构函数
  CTCPClient_CE::~CTCPClient_CE()
  {
  //释放socket资源
  WSACleanup();
  //关闭线程退出事件句柄
  CloseHandle(m_exitThreadEvent);
  //关闭互斥对象
  CloseHandle(m_hSynMutex);
  }
  /*-------------------------------------------------- ------------------
  【函数介绍】: 此线程用于监听TCP客户端通讯的事件,例如当接收到数据、
  连接断开和通讯过程发生错误等事件
  【入口参数】: lparam:无类型指针,可以通过此参数,向线程中传入需要用到的资源。
  在这里我们将CTCPClient_CE类实例指针传进来
  【出口参数】: (无)
  【返回 值】: 返回值没有特别的意义,在此我们将返回值设为0。
  -------------------------------------------------- -------------------*/
  DWORD CTCPClient_CE::SocketThreadFunc(LPVOID lparam)
  {
  CTCPClient_CE *pSocket;
  //得到CTCPClient_CE实例指针
  pSocket = (CTCPClient_CE*)lparam;
  //定义读事件集合
  fd_set fdRead;
  int ret;
  //定义事件等待时间
  TIMEVAL aTime;
  aTime.tv_sec = 1;
  aTime.tv_usec = 0;
  while (TRUE)
  {
  //收到退出事件,结束线程
  if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
  {
  break;
  }
  //置空fdRead事件为空
  FD_ZERO(&fdRead);
  //给客户端socket设置读事件
  FD_SET(pSocket->m_socket,&fdRead);
  //调用select函数,判断是否有读事件发生
  ret = select(0,&fdRead,NULL,NULL,&aTime);
  if (ret == SOCKET_ERROR)
  {
  //触发错误事件
  pSocket->OnError(pSocket->m_pOwnerWnd,1);
  //触发连接断开事件
  pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
  //关闭客户端socket
  closesocket(pSocket->m_socket);
  break;
  }
  if (ret > 0)
  {
  if (FD_ISSET(pSocket->m_socket,&fdRead))
  {
  //发生读事件
  char recvBuf[1024];
  int recvLen;
  ZeroMemory(recvBuf,1024);
  //接收数据
  recvLen = recv(pSocket->m_socket,recvBuf, 1024,0);
  if (recvLen == SOCKET_ERROR)
  {
  int iError = WSAGetLastError();
  //触发socket错误事件
  pSocket->OnError(pSocket->m_pOwnerWnd,iError);
  //触发与服务器断开事件
  pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
  //关闭客户端socket
  closesocket(pSocket->m_socket);
  break;
  }
  else if (recvLen == 0)
  {
  //触发与服务器端断开事件
  pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
  //关闭客户端socket
  closesocket(pSocket->m_socket);
  break;
  }
  else
  {
  //触发数据接收事件
  pSocket->OnRead(pSocket->m_pOwnerWnd,recvBuf,recvLen);
  }
  }
  }
  }
  return 0;
  }
  /*-------------------------------------------------- ------------------
  【函数介绍】: 用于打开客户端socket
  【入口参数】: pWnd用于指定父窗口句柄
  【出口参数】: (无)
  【返回 值】: TRUE:打开成功;FALSE:打开失败
  -------------------------------------------------- -------------------*/
  bool CTCPClient_CE::Open(CWnd * pWnd)
  {
  //复位线程退出事件
  ResetEvent(m_exitThreadEvent);
  //存储父窗口句柄
  m_pOwnerWnd = pWnd;
  //创建TCP套接字
  m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  if (m_socket == SOCKET_ERROR)
  {
  return FALSE;
  }
  //创建通讯线程
  m_tcpThreadHandle = CreateThread(NULL,0,SocketThreadFunc,this,0,NULL);
  if (m_tcpThreadHandle == NULL)
  {
  closesocket(m_socket);
  return FALSE;
  }
  return TRUE;
  }
  /*-------------------------------------------------- ------------------
  【函数介绍】: 用于关闭客户端socket
  【入口参数】: (无)
  【出口参数】: (无)
  【返回 值】: TRUE:关闭成功;FALSE:关闭失败
  -------------------------------------------------- -------------------*/
  bool CTCPClient_CE::Close()
  {
  //发送通讯线程结束事件
  SetEvent(m_exitThreadEvent);
  Sleep(1000);
  //关闭Socket,释放资源
  int err = closesocket(m_socket);
  if (err == SOCKET_ERROR)
  {
  return FALSE;
  }
  return TRUE;
  }
  /*-------------------------------------------------- ------------------
  【函数介绍】: 用于建立与TCP服务器连接
  【入口参数】: (无)
  【出口参数】: (无)
  【返回 值】: TRUE:建立连接成功;FALSE:建立连接失败
  -------------------------------------------------- -------------------*/
  bool CTCPClient_CE::Connect()
  {
  struct sockaddr_in addr;
  int err;
  addr.sin_family = AF_INET;
  addr.sin_port = htons(m_port);
  //此处要将双字节转换成单字节
  char ansiRemoteHost[255];
  ZeroMemory(ansiRemoteHost,255);
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_rem oteHost,wcslen(m_remoteHost)
  ,ansiRemoteHost,wcslen(m_remoteHost),NULL,NULL);
  addr.sin_addr.s_addr=inet_addr(ansiRemoteHost);
  //此时采用同步连接方式,connect直接返回成功或是失败
  err = connect(m_socket,(struct sockaddr *)&addr,sizeof(addr));
  if (err == SOCKET_ERROR)
  {
  return FALSE;
  }
  DWORD Result = GetLastError();
  //select 模型,即设置超时
  /* struct timeval timeout;
  fd_set r;
  FD_ZERO(&r);
  FD_SET(m_socket, &r);
  timeout.tv_sec = 15; //连接超时15秒
  timeout.tv_usec = 0;
  int ret = select(0, 0, &r, 0, &timeout);
  if(ret Windows\\unload.exe"), szUninstallBuf, NULL, NULL, NULL, 0, NULL, NULL, NULL, &stProgressInfo) )
  二、屏蔽talk键(打电话的那个键):向窗口发送SHCMBM_OVERRIDEKEY消息,在WM_HOTKEY中进行处理。
  参考SDK自带的Sample,位于"Windows Mobile 6 SDK\Samples\Common\CPP\Win32\FullScreen"目录。该例子演示了如何在Windows Mobile上隐藏taskbar和softkey,进行全屏显示。其中,退出全屏的功能,采用softkey按钮来实现。而具体的方式,就是向窗口发送SHCMBM_OVERRIDEKEY消息,在WM_HOTKEY中,加入用户自己的应用。以该工程为例,我们进行修改,加入"按Talk按键退出全屏"这个功能,而不弹出拨号界面。
  1.在SetSoftkeyBarForFullScreen函数中,加入消息发送函数:
  // Override/Undo softkeys for key press notifications, so we can
  // display taskbar & softkeys on SK1/SK2 press in full screen.
  DWORD dwBits;
  dwBits = bFullScreen
  ? SHMBOF_NODEFAULT | SHMBOF_NOTIFY
  : 0;
  SendMessage(hwndSoftKeyBar,
  SHCMBM_OVERRIDEKEY,
  VK_TSOFT1,
  MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, dwBits));
  SendMessage(hwndSoftKeyBar,
  SHCMBM_OVERRIDEKEY,
  VK_TSOFT2,
  MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, dwBits));
  //加入的消息发送函数
  SendMessage(hwndSoftKeyBar,
  SHCMBM_OVERRIDEKEY,
  VK_TTALK,
  MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, dwBits));
  2.在CALLBACK DialogProc(…)函数的WM_HOTKEY中,加入VK_TTALK键的处理:
  caseVK_TTALK:
  {
  // if we are in full screen mode we want to exit
  // when the user presses a softkey.
  if(g_bFullScreen)
  {
  SendMessage(GetDlgItem(hWnd,IDC_EDIT), WM_SETTEXT, 0, (LPARAM)L"[TALKkey] Exiting Full Screen");
  FullScreen(hWnd, FALSE);
  }
  }
  break;
  有关参考如下:
  WM_HOTKEY:http://msdn.microsoft.com/en-us/library/aa453868.a spx
  SHCMBM_OVERRIDEKEY:http://msdn.microsoft.com/en-us/library/aa454997.a spx
  三、Windows Mobile上的无线网络接入点扫描:codeproject上有个Wifi AP扫描程序,称为:Wifi scanner + custom MFC controls。用它能够扫描当前的无线环境,发现周围的AP接入点,显示他们的名字、MAC地址、信号强度(RSSI)、Wifi信道以及是否需要密码等信息。
  源码的运行设备是Pocket PC 2003se,要运行在window mobile平台,要在编译选项中Configuration Manger中选中wm设备,Active solution platform 选NEW,在弹出的窗口中,将new platform选择为windows mobile 的sdk,最后在Project->Properties中,选择Linker中的Command Line,在Additional Option中,将"machine:ARM"改为"machine:THUBM"。运行效果图如下:
  
  Download demo project - 97.6 Kb
  Download source - 90.8 Kb
  四、短信相关的AT指令:
  AT+CMGC:发出一条短消息 AT+CMGD:删除SIM卡内存的短消息
  AT+CMGF:选择短消息信息格式:0-PDU;1-文本
  AT+CMGL:列出SIM卡中的短消息PDU/text: 0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,
  4/"ALL"-全部的
  AT+CMGR:读短消息
  AT+CMGS:发送短消息
  AT+CMGW :向SIM内存中写入待发的短消息
  AT+CMSS:从SIM卡内存中发送短消息
  AT+CNMI:显示新收到的短消息
  AT+CPMS:选择短消息内存
  AT+CSCA:短消息中心地址
  AT+CSCB :选择蜂窝广播消息
  AT+CSMP:设置短消息文本模式参数
  AT+CSMS:选择短消息服务
  相关代码:
  初始化短信模式设置的时候,可以使用:
  //set AT+CMGF=1+回车换行
  m_serialPort2.Write(new char[] { 'A', 'T', '+', 'C', 'M', 'G', 'F', '=', '1' }, 0, 9);
  m_serialPort2.Write(new byte[] { 0x0D }, 0, 1);
  m_serialPort2.Write(new byte[] { 0x0A }, 0, 1); 短信内容发送完毕必须以十六进制数0x1A结束,例如,发送短信时,先发送对方号码,然后发送数据: //发送text中输入的对方手机号码
  stATCommand = "AT+CMGS=+86" + textBoxPhoneNumber.Text;
  btATCommand = stATCommand.ToCharArray();
  m_serialPort2.Write(btATCommand, 0, 22);
  m_serialPort2.Write(new byte[] { 0x0D }, 0, 1);
  m_serialPort2.Write(new byte[] { 0x0A }, 0, 1);
  Thread.Sleep(15);
  m_serialPort2.Write(new char[] { 'H', 'e', 'l', 'l', 'o'}, 0, 5);
  //set SMS end symbol
  m_serialPort2.Write(new byte[] { 0x1A }, 0, 1); //发送text中输入的对方手机号码
  stATCommand = "AT+CMGS=+86" + textBoxPhoneNumber.Text;
  btATCommand = stATCommand.ToCharArray();
  m_serialPort2.Write(btATCommand, 0, 22);
  m_serialPort2.Write(new byte[] { 0x0D }, 0, 1);
  m_serialPort2.Write(new byte[] { 0x0A }, 0, 1);
  Thread.Sleep(15);
  m_serialPort2.Write(new char[] { 'H', 'e', 'l', 'l', 'o'}, 0, 5);
  //set SMS end symbol
  m_serialPort2.Write(new byte[] { 0x1A }, 0, 1);
  五、怎样通过CMPP短信网关下发wap push ,相对于下发普通短信,有两个地方不同。
  1、CMPP_SUBMIT消息包的部分参数值改变。具体是:
  Msg_Fmt = 4(表示消息内容是二进制),
  TP_pid = 0;
  TP_udhi = 1;
  2、字段Msg_Content的内容是二进制数字,有特定的组合方式。格式解析起来,就是所谓的
  "压缩后的XML",即WBXML,一共有7个部分,把每个部分的二进制码按顺序组合起来填入
  Msg_Content字段,当做普通短信下发即可。代码大概如下:
  char szWapPushHeader1[12] = {0x0B, 0x05, 0x04, 0x0B, 0x84, 0x23, 0xF0, 0x00, 0x03,
  0x03, 0x01, 0x01};
  char szWapPushHeader2[9] = {0x29, 0x06, 0x06, 0x03, 0xAE, 0x81, 0xEA, 0x8D, 0xCA};
  char szWapPushIndicator[8] = {0x02, 0x05, 0x6A, 0x00, 0x45, 0xC6,0x0C, 0x03};
  char szWapPushDisplayTextHeader[3] = {0x00, 0x01, 0x03};
  char szEndOfWapPush[3] = {0x00, 0x01, 0x01};
  //以上数字串是什么意思,估计有几个说明可以参考下, 又是前人经验:
  //0B WAP PUSH头部的总长度
  //05040B8423F0表示接下来是一个WAP PUSH
  //00 表示是Concatenated Short Messages
  //03 长度
  //03 reference number
  //01 表示分成1个短信发送
  //01 当前包的序号
  //这个并不不影响功能的样子。好象只需要知道分几条短信和
  //序号发就可以了。以上每个部分,也有其他可以通过测试的不同的串值,目前只测了这种
  //常见的值。
  //以下两个字串就是需要自己填写的了:
  //szWapPushUrl:wap push的目的链接,费尽心机不就是想把这个发出去嘛。要求是"去除了
  //http://前缀的UTF8编码的Url地址"的二进制编码。现在是小测试,直接写上值吧,否则应
  //该是经过编码转化的。以下url内容是"wap.sina.com.cn"
  char szWapPushUrl[12] = {0x77,0x61,0x70,0x2E,0x73,0x69,0x6e,0x61,0x2e,0x63 ,0x6f,0x6d};
  //这个,就是想在手机上显示的关于这个URL的文字说明了,在我的手机上显示成该wap push
  //的标题.也同样是"UTF8编码的二进制"内容是"好好学习"
  char szMsg[12] = {0xE5,0xA5,0xBD,0xE5,0xA5,0xBD,0xE5,0xAD,0xA6,0xE4 ,0xB9,0xA0};
  具体的实现代码如下:
  char szHex[1024];
  int iUrllen,iMsgLen,iLen;
  iUrllen = 12;
  iMsgLen = 12;
  memset(szHex, 0, sizeof(szHex));
  iLen = 0;
  memcpy(szHex, szWapPushHeader1, 12);
  iLen += 12;
  memcpy(szHex+iLen, szWapPushHeader2, 9);
  iLen += 9;
  memcpy(szHex+iLen, szWapPushIndicator, 8);
  iLen += 8;
  memcpy(szHex+iLen, szWapPushUrl, iUrllen);
  iLen += iUrllen;
  memcpy(szHex+iLen, szWapPushDisplayTextHeader, 3);
  iLen += 3;
  memcpy(szHex+iLen, szMsg, iMsgLen);
  iLen += iMsgLen;
  memcpy(szHex+iLen, szEndOfWapPush, 3);
  iLen += 3;
  Msg_Length = iLen;
  memcpy((char*)Msg_Content, szHex, Msg_Length);
  //把Msg_Content当普通短信下发就可以了。对于push很多地方是被运营商给屏蔽了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值