- // SMS.cpp : 定义应用程序的入口点。
- //
- #include "stdafx.h"
- #include "SMS.h"
- #include <windows.h>
- #include <commctrl.h>
- #define MAX_LOADSTRING 100
- // 全局变量:
- HINSTANCE g_hInst; // 当前实例
- HWND g_hWndMenuBar; // 菜单栏句柄
- // 此代码模块中包含的函数的前向声明:
- ATOM MyRegisterClass( HINSTANCE , LPTSTR );
- BOOL InitInstance( HINSTANCE , int );
- LRESULT CALLBACK WndProc( HWND , UINT , WPARAM , LPARAM );
- INT_PTR CALLBACK About( HWND , UINT , WPARAM , LPARAM );
- HRESULT GetSMSMsgStore( ICEMAPISession * fpSession, IMsgStore * * fppMsgStore );
- HRESULT GetMMSMsgStore( ICEMAPISession * fpSession, IMsgStore * * fppMsgStore );
- HRESULT GetSMSInboxFolder( IMsgStore * fpMsgStore, IMAPIFolder * * fppInboxFolder );
- HRESULT CreateSMS( IMAPIFolder * fpInboxFolder, IMessage * * fppMsg );
- HRESULT CreateMMS( IMAPIFolder * fpInboxFolder, IMessage * * fppMsg );
- HRESULT SetRecipient( IMessage * fpMsg );
- HRESULT WriteShotRMessageInBox();
- HRESULT WriteMMessageInBox();
- int WINAPI WinMain( HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- HRESULT hr = S_OK;
- WriteShotRMessageInBox();
- WriteMMessageInBox();
- return hr == S_OK ? TRUE : FALSE ;
- }
- //
- // 函数: MyRegisterClass()
- //
- // 目的: 注册窗口类。
- //
- // 注释:
- //
- ATOM MyRegisterClass( HINSTANCE hInstance, LPTSTR szWindowClass)
- {
- WNDCLASS wc;
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpfnWndProc = WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SMS));
- wc.hCursor = 0;
- wc.hbrBackground = (HBRUSH ) GetStockObject(WHITE_BRUSH);
- wc.lpszMenuName = 0;
- wc.lpszClassName = szWindowClass;
- return RegisterClass(&wc);
- }
- //
- // 函数: InitInstance(HINSTANCE, int)
- //
- // 目的: 保存实例句柄并创建主窗口
- //
- // 注释:
- //
- // 在此函数中,我们在全局变量中保存实例句柄并
- // 创建和显示主程序窗口。
- //
- BOOL InitInstance( HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
- TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
- g_hInst = hInstance; // 将实例句柄存储在全局变量中
- // 在应用程序初始化期间,应调用一次 SHInitExtraControls 以初始化
- // 所有设备特定控件,例如,CAPEDIT 和 SIPPREF。
- SHInitExtraControls();
- LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadString(hInstance, IDC_SMS, szWindowClass, MAX_LOADSTRING);
- //如果它已经在运行,则将焦点置于窗口上,然后退出
- hWnd = FindWindow(szWindowClass, szTitle);
- if (hWnd)
- {
- // 将焦点置于最前面的子窗口
- // “| 0x00000001”用于将所有附属窗口置于前台并
- // 激活这些窗口。
- SetForegroundWindow((HWND )(( ULONG ) hWnd | 0x00000001));
- return 0;
- }
- if (!MyRegisterClass(hInstance, szWindowClass))
- {
- return FALSE;
- }
- hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
- CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
- if (!hWnd)
- {
- return FALSE;
- }
- // 使用 CW_USEDEFAULT 创建主窗口时,将不会考虑菜单栏的高度(如果创建了一个
- // 菜单栏)。因此,我们要在创建窗口后调整其大小
- // 如果菜单栏存在
- if (g_hWndMenuBar)
- {
- RECT rc;
- RECT rcMenuBar;
- GetWindowRect(hWnd, &rc);
- GetWindowRect(g_hWndMenuBar, &rcMenuBar);
- rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
- MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);
- }
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- return TRUE;
- }
- //
- // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
- //
- // 目的: 处理主窗口的消息。
- //
- // WM_COMMAND - 处理应用程序菜单
- // WM_PAINT - 绘制主窗口
- // WM_DESTROY - 发送退出消息并返回
- //
- //
- LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- PAINTSTRUCT ps;
- HDC hdc;
- static SHACTIVATEINFO s_sai;
- switch (message)
- {
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // 分析菜单选择:
- switch (wmId)
- {
- case IDM_HELP_ABOUT:
- DialogBox(g_hInst, (LPCTSTR )IDD_ABOUTBOX, hWnd, About);
- break ;
- case IDM_OK:
- SendMessage (hWnd, WM_CLOSE, 0, 0);
- break ;
- default :
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break ;
- case WM_CREATE:
- SHMENUBARINFO mbi;
- memset(&mbi, 0, sizeof (SHMENUBARINFO));
- mbi.cbSize = sizeof (SHMENUBARINFO);
- mbi.hwndParent = hWnd;
- mbi.nToolBarId = IDR_MENU;
- mbi.hInstRes = g_hInst;
- if (!SHCreateMenuBar(&mbi))
- {
- g_hWndMenuBar = NULL;
- }
- else
- {
- g_hWndMenuBar = mbi.hwndMB;
- }
- // 初始化外壳程序激活信息结构
- memset(&s_sai, 0, sizeof (s_sai));
- s_sai.cbSize = sizeof (s_sai);
- break ;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- EndPaint(hWnd, &ps);
- break ;
- case WM_DESTROY:
- CommandBar_Destroy(g_hWndMenuBar);
- PostQuitMessage(0);
- break ;
- case WM_ACTIVATE:
- // 向外壳程序通知我们的激活消息
- SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
- break ;
- case WM_SETTINGCHANGE:
- SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
- break ;
- default :
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
- // “关于”框的消息处理程序。
- INT_PTR CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_INITDIALOG:
- {
- // 创建一个“完成”按钮并调整其大小。
- SHINITDLGINFO shidi;
- shidi.dwMask = SHIDIM_FLAGS;
- shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
- shidi.hDlg = hDlg;
- SHInitDialog(&shidi);
- }
- return ( INT_PTR )TRUE;
- case WM_COMMAND:
- if (LOWORD(wParam) == IDOK)
- {
- EndDialog(hDlg, LOWORD(wParam));
- return TRUE;
- }
- break ;
- case WM_CLOSE:
- EndDialog(hDlg, message);
- return TRUE;
- }
- return ( INT_PTR )FALSE;
- }
- HRESULT GetMMSMsgStore( ICEMAPISession * fpSession, IMsgStore * * fppMsgStore )
- {
- ASSERT( fpSession && fppMsgStore );
- HRESULT hr = E_FAIL;
- IMAPITable* pMAPITable = NULL;
- SRowSet *pRows = NULL;
- ULONG ulMessageType = 0;
- fpSession->GetMsgStoresTable(NULL,&pMAPITable);
- if (NULL == pMAPITable)
- {
- goto TheEnd;
- }
- else
- {
- const ULONG ulNumCols = 2;
- SizedSPropTagArray(ulNumCols,Columns)={
- ulNumCols ,
- PR_ENTRYID,
- PR_DISPLAY_NAME
- };
- if ( FAILED( pMAPITable-> SetColumns((LPSPropTagArray)&Columns, 0) ) )
- {
- goto TheEnd;
- }
- BOOL bFindStore = FALSE;
- while (SUCCEEDED(pMAPITable-> QueryRows(1, 0, &pRows)) && bFindStore == FALSE )
- {
- if (NULL == pRows || pRows-> cRows != 1)
- {
- goto TheEnd;
- }
- if (_tcsicmp(pRows->aRow[0].lpProps[1].Value.lpszW, TEXT( "MMS" )) == 0)
- {
- ULONG ulMesageType;
- fpSession->OpenEntry(pRows->aRow[0].lpProps[0].Value.bin.cb,
- (LPENTRYID)pRows->aRow[0].lpProps[0].Value.bin.lpb,
- NULL,
- MAPI_BEST_ACCESS,
- &ulMesageType,
- (LPUNKNOWN*)fppMsgStore);
- bFindStore = TRUE;
- }
- FreeProws( pRows );
- pRows = NULL;
- }
- delete pMAPITable;
- pMAPITable = NULL;
- }
- if ( *fppMsgStore == NULL )
- goto TheEnd;
- hr = S_OK;
- TheEnd:
- if (pRows)
- {
- FreeProws(pRows);
- pRows = NULL;
- }
- if (pMAPITable)
- {
- delete pMAPITable;
- pMAPITable = NULL;
- }
- return hr;
- }
- HRESULT GetSMSMsgStore( ICEMAPISession * fpSession, IMsgStore * * fppMsgStore )
- {
- ASSERT( fpSession && fppMsgStore );
- HRESULT hr = E_FAIL;
- IMAPITable* pMAPITable = NULL;
- SRowSet *pRows = NULL;
- ULONG ulMessageType = 0;
- fpSession->GetMsgStoresTable(NULL,&pMAPITable);
- if (NULL == pMAPITable)
- {
- goto TheEnd;
- }
- else
- {
- const ULONG ulNumCols = 2;
- SizedSPropTagArray(ulNumCols,Columns)={
- ulNumCols ,
- PR_ENTRYID,
- PR_DISPLAY_NAME
- };
- if ( FAILED( pMAPITable-> SetColumns((LPSPropTagArray)&Columns, 0) ) )
- {
- goto TheEnd;
- }
- BOOL bFindStore = FALSE;
- while (SUCCEEDED(pMAPITable-> QueryRows(1, 0, &pRows)) && bFindStore == FALSE )
- {
- if (NULL == pRows || pRows-> cRows != 1)
- {
- goto TheEnd;
- }
- if (_tcsicmp(pRows->aRow[0].lpProps[1].Value.lpszW, TEXT( "SMS" )) == 0)
- {
- ULONG ulMesageType;
- fpSession->OpenEntry(pRows->aRow[0].lpProps[0].Value.bin.cb,
- (LPENTRYID)pRows->aRow[0].lpProps[0].Value.bin.lpb,
- NULL,
- MAPI_BEST_ACCESS,
- &ulMesageType,
- (LPUNKNOWN*)fppMsgStore);
- bFindStore = TRUE;
- }
- FreeProws( pRows );
- pRows = NULL;
- }
- delete pMAPITable;
- pMAPITable = NULL;
- }
- if ( *fppMsgStore == NULL )
- goto TheEnd;
- hr = S_OK;
- TheEnd:
- if (pRows)
- {
- FreeProws(pRows);
- pRows = NULL;
- }
- if (pMAPITable)
- {
- delete pMAPITable;
- pMAPITable = NULL;
- }
- return hr;
- }
- HRESULT GetSMSInboxFolder( IMsgStore * fpMsgStore, IMAPIFolder * * fppInboxFolder )
- {
- ASSERT( fpMsgStore && fppInboxFolder );
- HRESULT hr = S_OK;
- LPSPropValue rgprops = NULL;
- ULONG ulValues = 0;
- ULONG rgTags[] = {1,PR_CE_IPM_INBOX_ENTRYID};
- if (FAILED(fpMsgStore-> GetProps((LPSPropTagArray)rgTags,MAPI_UNICODE,&ulValues,&rgprops)))
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- if (FAILED(fpMsgStore-> OpenEntry(rgprops[0].Value.bin.cb,(LPENTRYID)rgprops[0].Value.bin.lpb,NULL,MAPI_MODIFY,NULL,(LPUNKNOWN*)fppInboxFolder)))
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- TheEnd:
- if (rgprops)
- {
- MAPIFreeBuffer(rgprops);
- }
- return hr;
- }
- HRESULT CreateSMS ( IMAPIFolder * fpInboxFolder, IMessage * * fppMsg )
- {
- ASSERT( fpInboxFolder && fppMsg );
- HRESULT hr = S_OK;
- SYSTEMTIME st;
- ADRLIST adlst = {0};
- SPropValue lpPropVal[5];
- ZeroMemory(&lpPropVal,sizeof (lpPropVal));
- //短信的内容(邮件的内容是放在 PR_BODY 里的,由于短信没有主题,而且可以在短信列表中显示出来,所以内容放在了这个字段)
- lpPropVal[0].ulPropTag = PR_SUBJECT;
- lpPropVal[0].Value.lpszW = L"你好" ; //This is a SMS Message
- lpPropVal[1].ulPropTag = PR_SENDER_EMAIL_ADDRESS; // 发件人地址
- lpPropVal[1].Value.lpszW = L"15868847603" ;
- lpPropVal[2].ulPropTag = PR_MESSAGE_CLASS; // 消息类型,邮件为(LPWSTR)L"IPM.Note"
- lpPropVal[2].Value.lpszW = (LPWSTR )L "IPM.SMStext" ;
- lpPropVal[3].ulPropTag = PR_MESSAGE_DELIVERY_TIME;// 发送时间 这里 应该和 PR_LAST_MODIFICATION_TIME 区别一下
- GetSystemTime(&st);
- SystemTimeToFileTime(&st, &(lpPropVal[3].Value.ft));
- lpPropVal[4].ulPropTag = PR_MESSAGE_FLAGS;
- lpPropVal[4].Value.ul = 0; //MSGFLAG_FROMME, MSGFLAG_READ, MSGFLAG_UNSENT 如果设置为 MSGFLAG_READ 为已读
- if ( FAILED( fpInboxFolder->CreateMessage(NULL,0,fppMsg) ) )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- if ( FAILED( ( *fppMsg )->SetProps(5,lpPropVal,NULL) ) )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- TheEnd:
- return hr;
- }
- HRESULT CreateMMS ( IMAPIFolder * fpInboxFolder, IMessage * * fppMsg )
- {
- ASSERT( fpInboxFolder && fppMsg );
- HRESULT hr = S_OK;
- SYSTEMTIME st;
- ADRLIST adlst = {0};
- SPropValue lpPropVal[6];
- ZeroMemory(&lpPropVal,sizeof (lpPropVal));
- //彩信的内容
- // lpPropVal[0].ulPropTag = PR_MSG_STATUS;
- // lpPropVal[0].Value.ul = MSGSTATUS_RECTYPE_SMTP;
- lpPropVal[0].ulPropTag = PR_SERVICE_NAME ;
- lpPropVal[0].Value.lpszW = L"MMS" ;
- lpPropVal[1].ulPropTag = PR_SUBJECT;
- lpPropVal[1].Value.lpszW = L"照片" ; //This is a SMS Message
- lpPropVal[2].ulPropTag = PR_SENDER_EMAIL_ADDRESS; // 发件人地址
- lpPropVal[2].Value.lpszW = L"15868847604" ;
- lpPropVal[3].ulPropTag = PR_MESSAGE_CLASS; // 消息类型,邮件为(LPWSTR)L"IPM.Note"
- lpPropVal[3].Value.lpszW = (LPWSTR )L "IPM.MMS" ; //IPM.SMStext,IPM.Note
- lpPropVal[4].ulPropTag = PR_MESSAGE_DELIVERY_TIME;// 发送时间 这里 应该和 PR_LAST_MODIFICATION_TIME 区别一下
- GetSystemTime(&st);
- SystemTimeToFileTime(&st, &(lpPropVal[4].Value.ft));
- lpPropVal[5].ulPropTag = PR_MESSAGE_FLAGS;
- lpPropVal[5].Value.ul = 0; //MSGFLAG_FROMME, MSGFLAG_READ, MSGFLAG_UNSENT 如果设置为 MSGFLAG_READ 为已读
- if ( FAILED( fpInboxFolder->CreateMessage(NULL,0,fppMsg) ) )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- if ( FAILED( ( *fppMsg )->SetProps(6,lpPropVal,NULL) ) )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- TheEnd:
- return hr;
- }
- HRESULT SetRecipient(IMessage * fpMsg)
- {
- ASSERT( fpMsg );
- HRESULT hr = S_OK;
- ULONG cRecipients = 1; // Send a message to one recipient.
- LPWSTR pszTo = L "13912345678" ; // 收件人地址
- ULONG cRecipientProperties = 3; // Set three properties for the recipient.
- LPADRLIST pRecipientList = NULL;
- ULONG cbRecipientList = 0;
- int cbRecipientProperties = 0;
- cbRecipientList = sizeof (ADRLIST) +
- cRecipients * (sizeof (ADRENTRY) +
- cRecipientProperties * (sizeof (SPropValue) +
- (wcslen(pszTo)+3) * sizeof ( WCHAR )));
- hr = MAPIAllocateBuffer(cbRecipientList, (LPVOID FAR *)&pRecipientList);
- if ( S_OK != hr )
- {
- goto TheEnd;
- }
- memset(pRecipientList, 0, cbRecipientList);
- pRecipientList->cEntries = cRecipients;
- pRecipientList->aEntries[0].cValues = cRecipientProperties;
- cbRecipientProperties = cRecipientProperties * sizeof (SPropValue);
- hr = MAPIAllocateBuffer(cbRecipientProperties, (LPVOID FAR *)&pRecipientList->aEntries[0].rgPropVals);
- if ( S_OK != hr )
- {
- goto TheEnd;
- }
- memset(pRecipientList->aEntries[0].rgPropVals, 0, sizeof (SPropValue) * 3);
- pRecipientList->aEntries[0].rgPropVals[0].ulPropTag = PR_RECIPIENT_TYPE;
- pRecipientList->aEntries[0].rgPropVals[0].Value.ul = MAPI_TO;//收件人类型 为 TO, 与此区别的还有 CC,BCC
- pRecipientList->aEntries[0].rgPropVals[1].ulPropTag = PR_ADDRTYPE;//这个只有这一个唯一的值
- pRecipientList->aEntries[0].rgPropVals[1].Value.lpszW = L"SMTP" ;
- pRecipientList->aEntries[0].rgPropVals[2].ulPropTag = PR_EMAIL_ADDRESS;//收件人地址(如果邮件是自己收到的,就是自己的地址)
- pRecipientList->aEntries[0].rgPropVals[2].Value.lpszW = pszTo;
- hr = fpMsg->ModifyRecipients(MODRECIP_ADD, pRecipientList);
- if ( S_OK != hr )
- {
- goto TheEnd;
- }
- TheEnd:
- if (pRecipientList->aEntries[0].rgPropVals)
- {
- MAPIFreeBuffer(pRecipientList->aEntries[0].rgPropVals);
- }
- if (pRecipientList)
- {
- MAPIFreeBuffer(pRecipientList);
- }
- return hr;
- }
- /*
- 把消息写入短信收件箱
- */
- HRESULT WriteShotRMessageInBox()
- {
- HRESULT hr = S_OK;
- ICEMAPISession * pSession = NULL;
- IMsgStore * pMsgStore = NULL;
- IMAPIFolder * pInboxFolder = NULL;
- LPMESSAGE pMsg = NULL;
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- MAPIInitialize(NULL);
- hr = MAPILogonEx(NULL, NULL, NULL, NULL, (LPMAPISESSION *)&pSession);
- if ( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- //获取存储空间
- hr = GetSMSMsgStore( pSession, &pMsgStore );
- if ( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- //获取存储文件夹
- hr = GetSMSInboxFolder( pMsgStore, &pInboxFolder );
- if ( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- //在文件夹下创建新信息
- hr = CreateSMS( pInboxFolder, &pMsg );
- if ( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- /*hr = SetRecipient( pMsg );
- if( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }*/
- TheEnd:
- if (NULL != pSession)
- {
- pSession->Logoff(0, 0, 0);
- pSession->Release();
- pSession = NULL;
- }
- MAPIUninitialize();
- CoUninitialize();
- return hr == S_OK ? TRUE : FALSE ;
- }
- HRESULT WriteMMessageInBox()
- {
- HRESULT hr = S_OK;
- ICEMAPISession * pSession = NULL;
- IMsgStore * pMsgStore = NULL;
- IMAPIFolder * pInboxFolder = NULL;
- LPMESSAGE pMsg = NULL;
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- MAPIInitialize(NULL);
- hr = MAPILogonEx(NULL, NULL, NULL, NULL, (LPMAPISESSION *)&pSession);
- if ( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- //获取存储空间
- //hr = GetSMSMsgStore( pSession, &pMsgStore );
- hr =GetMMSMsgStore( pSession, &pMsgStore );
- if ( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- //获取存储文件夹
- hr = GetSMSInboxFolder( pMsgStore, &pInboxFolder );
- if ( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- //在文件夹下创建新信息
- //hr = CreateSMS( pInboxFolder, &pMsg );
- hr = CreateMMS( pInboxFolder, &pMsg );
- if ( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }
- /*hr = SetRecipient( pMsg );
- if( S_OK != hr )
- {
- hr = E_FAIL;
- goto TheEnd;
- }*/
- TheEnd:
- if (NULL != pSession)
- {
- pSession->Logoff(0, 0, 0);
- pSession->Release();
- pSession = NULL;
- }
- MAPIUninitialize();
- CoUninitialize();
- return hr == S_OK ? TRUE : FALSE ;
- }
- </commctrl.h></windows.h>
SMS.cpp[WinCE]
最新推荐文章于 2024-04-22 10:11:29 发布