// DLG_Send.cpp : implementation file // #include "stdafx.h" #include "CorpSms.h" #include "DLG_Send.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #ifdef UNICODE class CAdoSmsItem:public CADORecordBinding { BEGIN_ADO_BINDING(CAdoSmsItem) ADO_VARIABLE_LENGTH_ENTRY2(1,adInteger, m_ItemID ,sizeof(m_ItemID), l_ItemIDStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(2,adInteger, m_BoxID ,sizeof(m_BoxID), l_BoxIDStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(3,adVarWChar,m_GroupID ,sizeof(m_GroupID) , l_GroupIDStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(4,adVarWChar,m_Name ,sizeof(m_Name) , l_NameStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(5,adVarWChar, m_NickName ,sizeof(m_NickName) , l_NickNameStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(6,adVarWChar, m_Mobile ,sizeof(m_Mobile) , l_MobileStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(7,adVarWChar, m_BZ ,sizeof(m_BZ) , l_BZStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(8,adVarWChar, m_Status ,sizeof(m_Status) , l_StatusStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(9,adInteger, m_SendID ,sizeof(m_SendID), l_SendIDStatus,false) END_ADO_BINDING() public: long m_ItemID; ULONG l_ItemIDStatus; long m_BoxID; ULONG l_BoxIDStatus; TCHAR m_GroupID[24]; ULONG l_GroupIDStatus; TCHAR m_Name[24]; ULONG l_NameStatus; TCHAR m_NickName[24]; ULONG l_NickNameStatus; TCHAR m_Mobile[24]; ULONG l_MobileStatus; #ifdef CHINABANK_VER TCHAR m_BZ[1024]; #else TCHAR m_BZ[184]; #endif ULONG l_BZStatus; TCHAR m_Status[4]; ULONG l_StatusStatus; long m_SendID; ULONG l_SendIDStatus; CAdoSmsItem() { m_ItemID = 0; m_BoxID = 0; memset(m_GroupID,0,sizeof(m_GroupID)); memset(m_Name,0,sizeof(m_Name)); memset(m_NickName,0,sizeof(m_NickName)); memset(m_Mobile,0,sizeof(m_Mobile)); memset(m_BZ,0,sizeof(m_BZ)); memset(m_Status,0,sizeof(m_Status)); m_SendID = 0; } }; #else class CAdoSmsItem:public CADORecordBinding { BEGIN_ADO_BINDING(CAdoSmsItem) ADO_VARIABLE_LENGTH_ENTRY2(1,adInteger, m_ItemID ,sizeof(m_ItemID), l_ItemIDStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(2,adInteger, m_BoxID ,sizeof(m_BoxID), l_BoxIDStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(3,adVarChar,m_GroupID ,sizeof(m_GroupID) , l_GroupIDStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(4,adVarChar,m_Name ,sizeof(m_Name) , l_NameStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(5,adVarChar, m_NickName ,sizeof(m_NickName) , l_NickNameStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(6,adVarChar, m_Mobile ,sizeof(m_Mobile) , l_MobileStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(7,adVarChar, m_BZ ,sizeof(m_BZ) , l_BZStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(8,adVarChar, m_Status ,sizeof(m_Status) , l_StatusStatus,false) ADO_VARIABLE_LENGTH_ENTRY2(9,adInteger, m_SendID ,sizeof(m_SendID), l_SendIDStatus,false) END_ADO_BINDING() public: long m_ItemID; ULONG l_ItemIDStatus; long m_BoxID; ULONG l_BoxIDStatus; char m_GroupID[24]; ULONG l_GroupIDStatus; char m_Name[24]; ULONG l_NameStatus; char m_NickName[24]; ULONG l_NickNameStatus; char m_Mobile[24]; ULONG l_MobileStatus; char m_BZ[184]; ULONG l_BZStatus; char m_Status[4]; ULONG l_StatusStatus; long m_SendID; ULONG l_SendIDStatus; CAdoSmsItem() { m_ItemID = 0; m_BoxID = 0; memset(m_GroupID,0,sizeof(m_GroupID)); memset(m_Name,0,sizeof(m_Name)); memset(m_NickName,0,sizeof(m_NickName)); memset(m_Mobile,0,sizeof(m_Mobile)); memset(m_BZ,0,sizeof(m_BZ)); memset(m_Status,0,sizeof(m_Status)); m_SendID = 0; } }; #endif ///////////////////////////////////////////////////////////////////////////// // DLG_Send dialog #include "MainFrm.h" #include "ProcessSocket.h" #include "DLG_Send_User.h" #include "DLG_Send_Inport.h" #include "DLG_FiltWarning.h" #include "DLG_SmsDY.h" #include "DLG_AddWarning.h" #include "DLG_Setup_SZGJ_GetMsg.h" #include "DLG_User_InportP2.h" #include "DLG_User_Inport_LT.h" #include "DLG_AddBack.h" #include "..\public\AutoBuffer\AutoBuffer.h" DLG_Send::DLG_Send(CWnd* pParent /*=NULL*/) : CDialog(DLG_Send::IDD, pParent) { //{{AFX_DATA_INIT(DLG_Send) //}}AFX_DATA_INIT m_pMainFrame = NULL; memset( &m_OldRect , 0 , sizeof(m_OldRect) ); m_bInit = false; m_bModify = false; m_lBoxID = 0; m_lBoxType = 0; memset( m_szMsg , 0 , sizeof(m_szMsg) ); memset( m_szMsgEndFilt , 0 , sizeof(m_szMsgEndFilt)); memset( m_szSendMsg , 0 , sizeof(m_szSendMsg) ); m_bSend = false; m_lSendIndex = 0; m_bShowReMobile = true; m_lReMobileType = 0; m_bBackReMobile = true; m_lBackReMobileType = 0; m_bSendSR = false; m_dwSendStartTime = 0; m_dwBackCount=0; //黑名单数量 m_dwNoSupCount=0; //不支持号码数量 m_dwNoMsgCount=0; //没内容数量 m_bSaveList = false; m_lPage = 0; m_lInterval = 0; m_bNoSupperWord = false; m_bOneToOne = false; m_lSendRand = 0; //发送的随机数 m_pMobileMsg = NULL; //手机号码的分段 m_pSendData = NULL; #ifdef SUPPER_IM_MAS m_Mas_Init = false; m_Mas_Lib = NULL; m_Mas_initWithDB = NULL; m_Mas_release = NULL; m_Mas_sendSMAdvTime = NULL; m_Mas_receiveSM = NULL; m_Mas_receiveRPT = NULL; m_Mas_MasEnd = false; m_Mas_MobsetEnd = false; m_Mas_SendOK = 0; m_lMasAllSendCount = 0; #endif } void DLG_Send::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(DLG_Send) DDX_Control(pDX, IDC_SEND_TASK, m_B_Task); DDX_Control(pDX, IDC_SEND_lInterval, m_L_lInterval); DDX_Control(pDX, IDC_SEND_FD, m_B_FD); DDX_Control(pDX, IDC_SEND_NEW2, m_B_New2); DDX_Control(pDX, IDC_SEND_LONGSMS, m_B_LongSms); DDX_Control(pDX, IDC_SEND_PCOUNT2, m_S_PCount2); DDX_Control(pDX, IDC_SEND_SAVESENDLOG, m_B_SaveSendLog); DDX_Control(pDX, IDC_SEND_CM_S, m_S_CM2); DDX_Control(pDX, IDC_SEND_CM, m_S_CM); DDX_Control(pDX, IDC_SEND_GETMSG, m_B_GetMsg); DDX_Control(pDX, IDC_SEND_REMOBILE, m_B_ReMobile); DDX_Control(pDX, IDC_SEND_DY, m_B_DY); DDX_Control(pDX, IDC_SEND_NEW, m_B_New); DDX_Control(pDX, IDC_SEND_NUMADD, m_B_Add); DDX_Control(pDX, IDC_SEND_NUM, m_E_Num); DDX_Control(pDX, IDC_SEND_DS_T, m_D_Time); DDX_Control(pDX, IDC_SEND_DS_D, m_D_Date); DDX_Control(pDX, IDC_SEND_YL, m_B_YL); DDX_Control(pDX, IDC_SEND_WCOUNT, m_S_WCount); DDX_Control(pDX, IDC_SEND_STATE, m_B_Status); DDX_Control(pDX, IDC_SEND_START, m_B_Start); DDX_Control(pDX, IDC_SEND_SAVE, m_B_Save); DDX_Control(pDX, IDC_SEND_S1, m_S_S1); DDX_Control(pDX, IDC_SEND_REPORT, m_B_Report); DDX_Control(pDX, IDC_SEND_PCOUNT, m_S_PCount); DDX_Control(pDX, IDC_SEND_NULL, m_B_Null); DDX_Control(pDX, IDC_SEND_MSG_LIST, m_S_MsgList); DDX_Control(pDX, IDC_SEND_MSG, m_E_Msg); DDX_Control(pDX, IDC_SEND_LIST_COUNT, m_S_ListCount); DDX_Control(pDX, IDC_SEND_LIST, m_wndList); DDX_Control(pDX, IDC_SEND_INMEMO, m_B_Memo); DDX_Control(pDX, IDC_SEND_INICENAME, m_B_NickName); DDX_Control(pDX, IDC_SEND_INAME, m_B_Name); DDX_Control(pDX, IDC_SEND_IFALSH, m_B_Flash); DDX_Control(pDX, IDC_SEND_HANDFREE, m_B_HandFree); DDX_Control(pDX, IDC_SEND_DS, m_B_DS); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(DLG_Send, CDialog) //{{AFX_MSG_MAP(DLG_Send) ON_WM_SIZE() ON_WM_CLOSE() ON_EN_CHANGE(IDC_SEND_MSG, OnChangeSendMsg) ON_BN_CLICKED(IDC_SEND_DS, OnSendDs) ON_BN_CLICKED(IDC_SEND_SAVE, OnSendSave) ON_NOTIFY(NM_RCLICK, IDC_SEND_LIST, OnRclickSendList) ON_BN_CLICKED(IDC_SEND_NUMADD, OnSendNumadd) ON_NOTIFY(NM_DBLCLK, IDC_SEND_LIST, OnDblclkSendList) ON_NOTIFY(DTN_DATETIMECHANGE, IDC_SEND_DS_D, OnDatetimechangeSendDsD) ON_NOTIFY(DTN_DATETIMECHANGE, IDC_SEND_DS_T, OnDatetimechangeSendDsT) ON_BN_CLICKED(IDC_SEND_NEW, OnSendNew) ON_BN_CLICKED(IDC_SEND_INAME, OnSendIname) ON_BN_CLICKED(IDC_SEND_INICENAME, OnSendInicename) ON_BN_CLICKED(IDC_SEND_INMEMO, OnSendInmemo) ON_BN_CLICKED(IDC_SEND_IFALSH, OnSendIfalsh) ON_BN_CLICKED(IDC_SEND_YL, OnSendYl) ON_WM_CREATE() ON_BN_CLICKED(IDC_SEND_START, OnSendStart) ON_WM_TIMER() ON_NOTIFY(LVN_KEYDOWN, IDC_SEND_LIST, OnKeydownSendList) ON_BN_CLICKED(IDC_SEND_DY, OnSendDy) ON_BN_CLICKED(IDC_SEND_GETMSG, OnSendGetmsg) ON_WM_DESTROY() ON_BN_CLICKED(IDC_SEND_LONGSMS, OnSendLongsms) ON_BN_CLICKED(IDC_SEND_NEW2, OnSendNew2) ON_BN_CLICKED(IDC_SEND_FD, OnSendFd) ON_BN_CLICKED(IDC_SEND_TASK, OnSendTask) //}}AFX_MSG_MAP ON_MESSAGE(DROPM_DROP,OnDrop) ON_COMMAND( SEND_USER_ADD , On_User_Add ) ON_COMMAND( SEND_USER_MODIFY , On_User_Modify ) ON_COMMAND( SEND_USER_DEL , On_User_Del ) ON_COMMAND( SEND_USER_CLEAR , On_User_Clear ) ON_COMMAND( SEND_USER_INPORT , On_User_Inport ) ON_COMMAND( SEND_USER_EXPORT , On_User_Export ) ON_COMMAND( SEND_USER_STATUS , On_User_Status ) ON_COMMAND( SEND_USER_INPORT_LT , On_User_Inport_LT ) ON_COMMAND( SEND_USER_INPORT_MASSDKDGWL_FP , On_User_Inport_MasSDK_DGWL_FP ) ON_COMMAND( SEND_USER_INPORT_MASSDKDGWL_SP , On_User_Inport_MasSDK_DGWL_SP ) ON_COMMAND( SEND_USER_INPORT_MASSDKDGWL_KF , On_User_Inport_MasSDK_DGWL_KF ) ON_COMMAND( SEND_USER_INPORT_MASSDKDGWL_ZC , On_User_Inport_MasSDK_DGWL_ZC ) ON_COMMAND( SEND_USER_PASTE , OnSendNumPaste ) // ON_WM_KEYUP() //ON_WM_HOTKEY() ON_BN_CLICKED(IDC_SEND_REMOBILE, &DLG_Send::OnClickedSendRemobile) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // DLG_Send message handlers BOOL DLG_Send::OnInitDialog() { CDialog::OnInitDialog(); this->SetIcon( AfxGetApp()->LoadIcon(IDI_L_SMSDF),false); m_D_Date.EnableWindow(false); m_D_Time.EnableWindow(false); m_B_ReMobile.SetCheck(true); //默认检测重复 m_B_SaveSendLog.SetCheck(true); //默认写到日志 m_B_LongSms.SetCheck(true); //默认以长短信方式发送 m_B_FD.SetCheck(false); //如果强制了使用长短信,则不能使用分段了 InitItem(); m_E_Msg.SetFocus(); if ( !m_pMainFrame->GetUserPurview( PURVIEW_SENDP , false ) ) { m_E_Num.EnableWindow( false ); //没有发送私人电话本的权限 m_B_Add.EnableWindow( false ); } if ( m_pMainFrame->m_Ans_Login.bCM ) //启用签名 { //this->AddLoveToMsg( _T("\r\n") ); this->AddLoveToMsg( m_pMainFrame->m_Ans_Login.szCM ); } CString strCM; m_pMainFrame->GetQJCM(strCM); if ( strCM.GetLength()>0 ) { strCM = strCM; m_S_CM.SetWindowText( strCM ); m_S_CM.SetTextColor(RGB(128,128,128)); } m_L_lInterval.SetCurSel(0); m_bModify = false; if ( !m_pMainFrame->GetUserPurview( PURVIEW_PL , false ) ) { m_B_Task.EnableWindow(false); } #ifdef SMSCENTER_NX GetDlgItem(IDC_SEND_FD)->ShowWindow(SW_HIDE); #endif return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void DLG_Send::InitItem() { if ( m_bInit ) return ; m_bInit = true; //限制最大可发送的数据长度 #ifdef UNICODE m_E_Msg.LimitText( MAX_MSG_LEN_UNI ); #else m_E_Msg.LimitText( MAX_MSG_LEN ); #endif #ifdef CHINABANK_VER m_E_Msg.LimitText( MAX_MSG_LEN_UNI_BANK ); #endif //创建图像列表 m_Image.Create( 20 , 20 , ILC_COLOR32|ILC_MASK , 5 , 1); CBitmap bmp; bmp.LoadBitmap( IDB_L_USER_NOR ); m_Image.Add( &bmp , RGB(193,193,193) ); //设置 bmp.DeleteObject(); bmp.LoadBitmap( IDB_L_USER_EXP ); m_Image.Add( &bmp , RGB(193,193,193) ); //设置 //加入图像列表 m_wndList.SetImageList(&m_Image,LVSIL_SMALL); m_wndList.SetBkColor( RGB(237,238,188) ); m_wndList.SetTextBkColor( RGB(237,238,188) ); //m_wndList.SubClassWindow2(); //m_wndList.SetHeadings(_T(" 姓 名,80; 昵 称,80;手机号码,100; 状 态,70; 用户组,80; 备 注,150;")); //m_wndList.SetGridLines(true); //设置成热激活形式 //m_wndList.SetExtendedStyle(LVS_EX_TRACKSELECT|LVS_EX_ONECLICKACTIVATE|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_wndList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_wndList.InsertColumn( 0 , _T(" 姓 名") , LVCFMT_LEFT , 100 , 0); m_wndList.InsertColumn( 1 , _T(" 昵 称") , LVCFMT_LEFT , 80 , 1); if ( this->m_pMainFrame->GetUserPurview_HideNum() ) { m_wndList.InsertColumn( 2 , _T("手机号码") , LVCFMT_LEFT , 70 , 2); //隐藏号码 CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)m_wndList.GetHeaderCtrl(); pHeaderCtrl->EnableWindow( FALSE ) ; } else { m_wndList.InsertColumn( 2 , _T("手机号码") , LVCFMT_LEFT , 100 , 2); } m_wndList.InsertColumn( 3 , _T(" 状 态") , LVCFMT_LEFT , 80, 3); m_wndList.InsertColumn( 4 , _T(" 用户组") , LVCFMT_LEFT , 85 , 4); m_wndList.InsertColumn( 5 , _T(" 备 注"), LVCFMT_LEFT , 150, 5); //初始化图标按扭 CRect rect; m_B_Start.GetWindowRect(&rect); this->ScreenToClient(&rect); int iHeight = rect.Height(); //按扭高度 int iWidth = iHeight; //按扭宽度,与高相同,原图像长宽:44*44 int iLeftBegin = rect.left; m_B_Start.MoveWindow(iLeftBegin, rect.top , iWidth, iHeight, true ); m_B_Start.SetUnSelToolTip( _T("立即发送") ); m_B_Start.ActiveToolTip( true ); m_B_Start.SetUnSelBmp( IDB_B_START ); m_B_Start.SetFlat(); m_B_New2.MoveWindow(iLeftBegin+= iWidth, rect.top , iWidth, iHeight, true ); m_B_New2.SetUnSelToolTip( _T("重新发送本列表的手机号码") ); m_B_New2.ActiveToolTip( true ); m_B_New2.SetUnSelBmp( IDB_B_NEW2 ); m_B_New2.SetFlat(); m_B_New.MoveWindow(iLeftBegin += iWidth, rect.top , iWidth, iHeight, true ); m_B_New.SetUnSelToolTip( _T("新建发送列表") ); m_B_New.ActiveToolTip( true ); m_B_New.SetUnSelBmp( IDB_B_NEW ); m_B_New.SetFlat(); m_B_Save.MoveWindow(iLeftBegin += iWidth, rect.top , iWidth, iHeight, true ); m_B_Save.SetUnSelToolTip( _T("保存当前发送列表") ); m_B_Save.ActiveToolTip( true ); m_B_Save.SetUnSelBmp( IDB_B_SAVE ); m_B_Save.SetFlat(); //m_B_Status.MoveWindow( iLeftBegin+=iWidth , rect.top , iWidth , iHeight , true ); //m_B_Status.SetUnSelToolTip( _T("刷新发送状态") ); //m_B_Status.ActiveToolTip( true ); //m_B_Status.SetUnSelBmp( IDB_B_STATE ); //m_B_Status.SetFlat(); m_B_DY.MoveWindow(iLeftBegin += iWidth, rect.top , iWidth, iHeight, true ); m_B_DY.SetUnSelToolTip( _T("选择常用短语") ); m_B_DY.ActiveToolTip( true ); m_B_DY.SetUnSelBmp( IDB_B_DY ); m_B_DY.SetFlat(); //画最的一个空按扭 iLeftBegin += iWidth; CRect rect2; CWnd * pWnd = (CWnd *)GetDlgItem(IDC_SEND_S1); pWnd->GetWindowRect( &rect2 ); long width = rect2.right - iLeftBegin - 8; m_B_Null.MoveWindow(iLeftBegin, rect.top , width , iHeight, true ); //m_B_Null.SetUnSelToolTip( _T("其它功能,必须在连接后并没有发送时才可使用!") ); m_B_Null.SetUnSelToolTip( _T("") ); m_B_Null.ActiveToolTip( true ); m_B_Null.SetUnSelBmp( IDB_B_NULL ); m_B_Null.SetFlat(); m_B_Null.EnableWindow(false); m_B_Null.ShowWindow(SW_HIDE); m_B_Name.GetWindowRect(&rect); this->ScreenToClient(&rect); iLeftBegin = rect.left; iHeight = rect.Height(); //按扭高度 iWidth = (int)((float)iHeight*(60.0f/48.0f)); //按比例调整宽度 m_B_Name.MoveWindow(iLeftBegin, rect.top , iWidth, iHeight , true ); m_B_Name.SetUnSelToolTip( _T("插入姓名,发送时将会自动换成当前用户姓名发送!\r\n注意:插入姓名后,字数统计仅供参考,以实际姓名字数为准。") ); m_B_Name.ActiveToolTip( true ); m_B_Name.SetUnSelBmp( IDB_B_INAME ); m_B_Name.SetFlat(); m_B_NickName.MoveWindow(iLeftBegin += iWidth, rect.top, iWidth, iHeight, true); m_B_NickName.SetUnSelToolTip( _T("插入昵称,发送时将会自动换成当前用户昵称发送!\r\n注意:插入昵称后,字数统计仅供参考,以实际昵称字数为准。") ); m_B_NickName.ActiveToolTip( true ); m_B_NickName.SetUnSelBmp( IDB_B_INICENAME ); m_B_NickName.SetFlat(); m_B_Memo.MoveWindow(iLeftBegin += iWidth, rect.top, iWidth, iHeight, true); m_B_Memo.SetUnSelToolTip( _T("插入备注,发送时将会自动换成当前用户的备注内容发送!\r\n注意:插入备注后,字数统计仅供参考,以实际备注字数为准。") ); m_B_Memo.ActiveToolTip( true ); m_B_Memo.SetUnSelBmp( IDB_B_INMEMO ); m_B_Memo.SetFlat(); m_B_Flash.MoveWindow(iLeftBegin += iWidth, rect.top, iWidth, iHeight, true); m_B_Flash.SetUnSelToolTip( _T("插入闪烁符,对方收到时闪烁符中间的字符会不停闪动!") ); m_B_Flash.ActiveToolTip( true ); m_B_Flash.SetUnSelBmp( IDB_B_IFALSH ); m_B_Flash.SetFlat(); m_B_YL.MoveWindow(iLeftBegin += iWidth, rect.top, iWidth, iHeight, true); m_B_YL.SetUnSelToolTip( _T("预览短信!") ); m_B_YL.ActiveToolTip( true ); m_B_YL.SetUnSelBmp( IDB_B_YL ); m_B_YL.SetFlat(); //是否显示小灵通短信条数提示 if ( !m_pMainFrame->isSupportPhs() ) { CRect rect; m_S_PCount2.ShowWindow(SW_HIDE); m_S_WCount.GetWindowRect(&rect); rect.top+=10; rect.bottom+=10; ScreenToClient(&rect); m_S_WCount.MoveWindow(rect); m_S_PCount.GetWindowRect(&rect); rect.top+=13; rect.bottom+=13; ScreenToClient(&rect); m_S_PCount.MoveWindow(rect); } #ifndef MOBSET_SZGJ //如果不是深圳公交集团,不显示取信息按扭。 m_B_GetMsg.ShowWindow(SW_HIDE); #endif // m_D_Date.EnableWindow( false ); // m_D_Time.EnableWindow( false ); m_bInit = true; //启用保存ID的线程 ::AfxBeginThread((AFX_THREADPROC)AutoSaveLog,(LPVOID)this,/*THREAD_PRIORITY_LOWEST*/THREAD_PRIORITY_BELOW_NORMAL); #ifdef SUPPER_IM_MAS if ( Mas_Enable() ) //是否启用Mas { SetTimer(2 , 5000 , NULL ); //5秒后连接Mas信息机 } #endif } void DLG_Send::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if ( !m_bInit ) return; CRect rect; this->GetWindowRect(&rect); if ( rect.Width()<200 || rect.Height() < 150 ) //当SIZE已很小时则不用再移动窗口 return; CRect rect3; CRect rUser; //重置用户列表 m_wndList.GetWindowRect( &rUser ); rect3.left = rUser.left; rect3.top = rUser.top; rect3.right = rect.right - 17; rect3.bottom = rect.bottom -17; this->ScreenToClient(&rect3); m_wndList.MoveWindow(&rect3); //重置计数表 m_S_ListCount.GetWindowRect( &rUser ); rect3.left = rUser.left; rect3.top = rUser.top; rect3.right = rect.right - 17+7; rect3.bottom = rect.bottom -17+7; this->ScreenToClient(&rect3); m_S_ListCount.MoveWindow(&rect3); //重置信息栏 m_E_Msg.GetWindowRect( &rUser ); rect3.left = rUser.left; rect3.top = rUser.top; rect3.right = rUser.right; rect3.bottom = rect.bottom -39; this->ScreenToClient(&rect3); m_E_Msg.MoveWindow(&rect3); //重置签名 m_S_CM2.GetWindowRect( &rUser ); rect3.left = rUser.left; rect3.top = rect.bottom -34; rect3.right = rUser.right; rect3.bottom = rect3.top+rUser.Height(); this->ScreenToClient(&rect3); m_S_CM2.MoveWindow(&rect3); m_S_CM.GetWindowRect( &rUser ); rect3.left = rUser.left; rect3.top = rect.bottom -34; rect3.right = rUser.right; rect3.bottom = rect3.top+rUser.Height(); this->ScreenToClient(&rect3); m_S_CM.MoveWindow(&rect3); //重置信息静态控件 m_S_MsgList.GetWindowRect( &rUser ); rect3.left = rUser.left; rect3.top = rUser.top; rect3.right = rUser.right; rect3.bottom = rect.bottom -17+7; this->ScreenToClient(&rect3); m_S_MsgList.MoveWindow(&rect3); } void DLG_Send::OnClose() { if ( CloseList() ) { CDialog::OnClose(); } } void DLG_Send::RefreshTJ() { #ifdef UNICODE TCHAR szMsg[4096];memset(szMsg , 0 , sizeof(szMsg) ); long lMaxMsgLen = m_pMainFrame->GetMaxSendMsgLen(); //取允许的最大字符数 //以下为统计字数 m_E_Msg.GetWindowText( szMsg , sizeof(szMsg)/2 ); ExChar( szMsg , _T("\r") ); //去除,防多行 long lLen=0; long lLen2=0; long lPage=0; long lPage2=0; //if ( isChinese( szMsg , _tcslen(szMsg) ) ) //{ lLen = _tcslen(szMsg); lPage = lLen/lMaxMsgLen; if (lPage*lMaxMsgLen!=lLen) lPage++; lPage2 = lLen/(lMaxMsgLen-12); if (lPage2*(lMaxMsgLen-12)!=lLen) lPage2++; //} //else //{ // long lPageLen = lMaxMsgLen*2+lMaxMsgLen*2/7; // lLen = _tcslen( szMsg ); // lPage = lLen/lPageLen; // if (lPage*lPageLen!=lLen) lPage++; //} //长短信方式 if ( m_B_LongSms.GetCheck() && lLen>lMaxMsgLen) { long lCMLen=0; lMaxMsgLen=m_pMainFrame->GetMaxSendMsgLen_longSms(lCMLen); lLen2 = lLen+lCMLen; //原条数加上签名的条数 lPage = lLen2/lMaxMsgLen; long lEndMsgLen = lLen2%lMaxMsgLen; if (lEndMsgLen!=0) lPage++; else lEndMsgLen = lMaxMsgLen; #if defined(SMSCENTER_NX) && !defined(SMSCENTER_GDDX) long lNX_CMLen = 6; #ifdef SMSCENTER_DGSB lNX_CMLen = 6; //签名【东莞人社】 #endif if ( lEndMsgLen+lNX_CMLen > lMaxMsgLen ) { lPage++; } #endif } else { if ( m_B_FD.GetCheck() ) { if (lLen>lMaxMsgLen) { lMaxMsgLen-=4; //已大于最大长度,需要分段,每段前要加入分段志,"1/2:",共计4个字节 lPage = lLen/lMaxMsgLen; if (lPage*lMaxMsgLen!=lLen) lPage++; lPage2 = lLen/(lMaxMsgLen-12); if (lPage2*(lMaxMsgLen-12)!=lLen) lPage2++; } else { if ( lLen>(lMaxMsgLen-12) ) //移动的长度不够,小灵通长度超过了。 { lMaxMsgLen-=4; //已大于最大长度,需要分段,每段前要加入分段志,"1/2:",共计4个字节 lPage2 = lLen/(lMaxMsgLen-12); if (lPage2*(lMaxMsgLen-12)!=lLen) lPage2++; } } } } TCHAR Buf[256]; _stprintf( Buf , _T("字数:%d") , lLen ); m_S_WCount.SetWindowText(Buf); _stprintf( Buf , _T("条数:%d") , lPage ); m_S_PCount.SetWindowText(Buf); _stprintf( Buf , _T("小灵通:%d") , lPage2 ); m_S_PCount2.SetWindowText(Buf); m_lPage = lPage; #else long lMaxMsgLen = m_pMainFrame->GetMaxSendMsgLen(); //取允许的最大字符数 //以下为统计字数 char szMsg[4096];memset(szMsg , 0 , sizeof(szMsg) ); char szHex[8192];memset(szHex , 0 , sizeof(szHex) ); m_E_Msg.GetWindowText( szMsg , sizeof(szMsg) ); ExChar( szMsg , _T("\r") ); //去除,防多行 long lLen=0; long lLen2=0; long lPage=0; long lPage2=0; //if ( isChinese( szMsg , _tcslen(szMsg) ) ) //{ AsciiToUCS2(szMsg , szHex ); lLen = _tcslen(szHex)/4; lPage = lLen/lMaxMsgLen; if (lPage*lMaxMsgLen!=lLen) lPage++; lPage2 = lLen/(lMaxMsgLen-12); if (lPage2*(lMaxMsgLen-12)!=lLen) lPage2++; //} //else //{ // long lPageLen = lMaxMsgLen*2+lMaxMsgLen*2/7; // lLen = _tcslen( szMsg ); // lPage = lLen/lPageLen; // if (lPage*lPageLen!=lLen) lPage++; //} //长短信方式 if ( m_B_LongSms.GetCheck() ) { long lCMLen=0; lMaxMsgLen=m_pMainFrame->GetMaxSendMsgLen_longSms(lCMLen); lLen2 = lLen+lCMLen; //原条数加上签名的条数 lPage = lLen2/lMaxMsgLen; long lEndMsgLen = lLen2%lMaxMsgLen; if (lEndMsgLen!=0) lPage++; else lEndMsgLen = lMaxMsgLen; #if defined(SMSCENTER_NX) && !defined(SMSCENTER_GDDX) long lNX_CMLen = 6; #ifdef SMSCENTER_DGSB lNX_CMLen = 6; //签名【东莞人社】 #endif if ( lEndMsgLen+lNX_CMLen > lMaxMsgLen ) { lPage++; } #endif } else { if ( m_B_FD.GetCheck() ) { if (lLen>lMaxMsgLen) { lMaxMsgLen-=4; //已大于最大长度,需要分段,每段前要加入分段志,"1/2:",共计4个字节 lPage = lLen/lMaxMsgLen; if (lPage*lMaxMsgLen!=lLen) lPage++; lPage2 = lLen/(lMaxMsgLen-12); if (lPage2*(lMaxMsgLen-12)!=lLen) lPage2++; } else { if ( lLen>(lMaxMsgLen-12) ) //移动的长度不够,小灵通长度超过了。 { lMaxMsgLen-=4; //已大于最大长度,需要分段,每段前要加入分段志,"1/2:",共计4个字节 lPage2 = lLen/(lMaxMsgLen-12); if (lPage2*(lMaxMsgLen-12)!=lLen) lPage2++; } } } } char Buf[256]; _stprintf( Buf , "字数:%d" , lLen ); m_S_WCount.SetWindowText(Buf); _stprintf( Buf , "条数:%d" , lPage ); m_S_PCount.SetWindowText(Buf); _stprintf( Buf , "小灵通:%d" , lPage2 ); m_S_PCount2.SetWindowText(Buf); m_lPage = lPage; #endif } void DLG_Send::OnChangeSendMsg() { m_bModify = true; //已修改过 RefreshTJ(); } void DLG_Send::OnSendDs() { m_bModify = true;//已修改过 BOOL b = m_B_DS.GetCheck(); if ( b ) { m_D_Date.EnableWindow( true ); m_D_Time.EnableWindow( true ); } else { m_D_Date.EnableWindow( false ); m_D_Time.EnableWindow( false ); } } BOOL DLG_Send::CloseList() { if (m_bModify) { long lRet = MessageBox(_T("发送列表已更改,是否保存?") , _T("保存") , MB_ICONQUESTION|MB_YESNOCANCEL); if ( lRet == IDYES ) { return List_Save(); } if ( lRet == IDNO ) { //新建一个列表 EnableModifyWindow( true ); //可以修改 m_B_DS.SetCheck(false); //没有定时 SYSTEMTIME t;::GetLocalTime(&t); DateTime_SetSystemtime( m_D_Date.m_hWnd , GDT_VALID , &t ); DateTime_SetSystemtime( m_D_Time.m_hWnd , GDT_VALID , &t ); m_wndList.ShowWindow(SW_HIDE); m_wndList.DeleteAllItems(); //没有列表 //删除临时数据库 m_strSort.Clear(); //清空数据 m_wndList.ShowWindow(SW_SHOW); RefreshListCount(); //刷新显示列表上的记录计数 m_E_Msg.SetWindowText( _T("") ); //没有内容 if ( m_pMainFrame->m_Ans_Login.bCM ) //启用签名 { //this->AddLoveToMsg( _T("\r\n") ); this->AddLoveToMsg( m_pMainFrame->m_Ans_Login.szCM ); } OnSendDs(); //设置定时 RefreshTJ(); //刷新显示字数 m_bModify = false; m_lBoxID = 0; m_lBoxType = 0; //待发短信 m_E_Msg.SetFocus(); return true; } else return false; //选择了取消 } return true; } void DLG_Send::OnSendSave() { if ( List_Save(true) ) this->ShowWindow( SW_HIDE ); } BOOL DLG_Send::List_New() { if ( IsSend() ) //判断是否在正在发送短信 return false; if (!CloseList()) return false; /* long lCount=0; while( m_bSaveList && lCount<50 ) //等待保存列表返回 { Sleep(100); } */ //生日祝福专用 SetListSR(false); EnableModifyWindow( true ); //可以修改 m_B_DS.SetCheck(false); //没有定时 SYSTEMTIME t;::GetLocalTime(&t); DateTime_SetSystemtime( m_D_Date.m_hWnd , GDT_VALID , &t ); DateTime_SetSystemtime( m_D_Time.m_hWnd , GDT_VALID , &t ); m_wndList.ShowWindow(SW_HIDE); m_wndList.DeleteAllItems(); //没有列表 //删除临时数据库 m_strSort.Clear(); //清空数据 m_wndList.ShowWindow(SW_SHOW); RefreshListCount(); //刷新显示列表上的记录计数 m_E_Msg.SetWindowText( _T("") ); //没有内容 if ( m_pMainFrame->m_Ans_Login.bCM ) //启用签名 { //this->AddLoveToMsg( _T("\r\n") ); this->AddLoveToMsg( m_pMainFrame->m_Ans_Login.szCM ); } OnSendDs(); //设置定时 RefreshTJ(); //刷新显示字数 m_bModify = false; m_lBoxID = 0; m_lBoxType = 0; //待发短信 m_B_Task.SetCheck(false);// 不是任务方式 #ifdef SUPPER_IM_MAS m_B_SaveSendLog.SetCheck(true);//选中记录日志 m_B_ReMobile.SetCheck(true);//选中查重 #endif OnSendTask2(); m_E_Msg.SetFocus(); this->SetFocus(); return true; } void DLG_Send::SetMainFrame(CMainFrame *pFrame) { m_pMainFrame = pFrame; m_pSocket = &m_pMainFrame->m_Socket; m_AdoRS.SetAdoConnection( &m_pMainFrame->m_adoConnection ); m_AdoRS2.SetAdoConnection( &m_pMainFrame->m_adoConnection ); m_AdoRS3.SetAdoConnection( &m_pMainFrame->m_adoConnection ); m_AdoRS4.SetAdoConnection( &m_pMainFrame->m_adoConnection ); m_AdoRS4.SetCursorLocation(adUseClient); m_AdoRS5.SetAdoConnection( &m_pMainFrame->m_adoConnection ); m_AdoRS5.SetCursorLocation(adUseClient); m_AdoRS6.SetAdoConnection( &m_pMainFrame->m_adoConnection ); } long DLG_Send::GetCurrentSelected() { POSITION pos = m_wndList.GetFirstSelectedItemPosition(); if ( pos ) { return m_wndList.GetNextSelectedItem(pos); } return -1; } void DLG_Send::OnRclickSendList(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; ShowRMenu(); } void DLG_Send::ShowRMenu() { if ( m_lBoxType == 1 ) //列表为已发的不能编辑 return ; if ( m_bSend ) //正在发送,不能编辑 return ; CMenu menu; menu.CreatePopupMenu(); BOOL bLock = false; long lItem = this->GetCurrentSelected(); //添加 if ( m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false) ) { menu.AppendMenu(MF_STRING , SEND_USER_ADD, _T(" 添加用户 ") ); menu.AppendMenu(MF_STRING , SEND_USER_PASTE, _T(" 粘贴用户 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_ADD , _T(" 添加用户 ") ); menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_PASTE , _T(" 粘贴用户 ") ); } menu.AppendMenu(MF_SEPARATOR ); //修改 if (m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false) && lItem >=0 && !this->m_pMainFrame->GetUserPurview_HideNum()) { menu.AppendMenu(MF_STRING , SEND_USER_MODIFY, _T(" 修 改 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_MODIFY , _T(" 修 改 ") ); } //删除 if ( lItem >=0 ) { menu.AppendMenu(MF_STRING , SEND_USER_DEL, _T(" 删 除 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_DEL , _T(" 删 除 ") ); } //清空 menu.AppendMenu(MF_SEPARATOR ); menu.AppendMenu(MF_STRING , SEND_USER_CLEAR, _T(" 清 空 ") ); menu.AppendMenu(MF_SEPARATOR ); if (m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false) ) { menu.AppendMenu(MF_STRING , SEND_USER_INPORT, _T(" 导入列表 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_INPORT, _T(" 导入列表 ") ); } if ( !this->m_pMainFrame->GetUserPurview_HideNum() ) menu.AppendMenu(MF_STRING , SEND_USER_EXPORT, _T(" 导出列表 ") ); else menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_EXPORT, _T(" 导出列表 ") ); #ifdef FSLT_VER menu.AppendMenu(MF_SEPARATOR ); if (m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false)) { menu.AppendMenu(MF_STRING , SEND_USER_INPORT_LT, _T(" 导入报价 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_INPORT_LT, _T(" 导入报价 ") ); } #endif #ifdef MOBSET_OEM_MASSDKDGWL menu.AppendMenu(MF_SEPARATOR ); if (m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false)) { menu.AppendMenu(MF_STRING , SEND_USER_INPORT_MASSDKDGWL_FP, _T(" 发送放盘信息 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_INPORT_MASSDKDGWL_FP, _T(" 发送放盘信息 ") ); } if (m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false)) { menu.AppendMenu(MF_STRING , SEND_USER_INPORT_MASSDKDGWL_SP, _T(" 发送收盘信息 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_INPORT_MASSDKDGWL_SP, _T(" 发送收盘信息 ") ); } if (m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false)) { menu.AppendMenu(MF_STRING , SEND_USER_INPORT_MASSDKDGWL_KF, _T(" 发送看房通知 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_INPORT_MASSDKDGWL_KF, _T(" 发送看房通知 ") ); } if (m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false)) { menu.AppendMenu(MF_STRING , SEND_USER_INPORT_MASSDKDGWL_ZC, _T(" 发送新政策宣传 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , SEND_USER_INPORT_MASSDKDGWL_ZC, _T(" 发送新政策宣传 ") ); } #endif menu.AppendMenu(MF_SEPARATOR ); menu.AppendMenu(MF_STRING , SEND_USER_STATUS, _T(" 刷新状态 ") ); //显示菜单 POINT pt ; ::GetCursorPos( &pt ); //this->ClientToScreen( &pt); menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL); menu.DestroyMenu(); } void DLG_Send::On_User_Add() { if ( !m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false) ) return ; Send_User user={0}; DLG_Send_User dlg(this); dlg.SetParam( user ); if ( dlg.DoModal() == IDOK ) { m_bModify = true; //已修改 user = dlg.GetParam(); AddUser( user ); RefreshListCount(); //刷新显示列表上的记录计数 } } void DLG_Send::On_User_Modify() { if ( !m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false) ) return ; if ( this->m_pMainFrame->GetUserPurview_HideNum() ) { return ; //隐藏号码的,不允许修改 } long lItem = GetCurrentSelected(); if ( lItem < 0 ) return ; Send_User user = GetUser(lItem); if ( user.szStatus[0] == '1' ) //发送成功 { MessageBox( _T("因为此号码已成功发送短信,所以不能修改!") , _T("错误") , MB_ICONWARNING ); return ; } if ( CString(user.szNickName) == CString(_T("任务号码组")) ) { MessageBox( _T("任务号码组,无法修改!") , _T("错误") , MB_ICONWARNING ); return ; } DLG_Send_User dlg(this); dlg.SetParam( user ); if ( dlg.DoModal() == IDOK ) { m_bModify = true; //已修改 user = dlg.GetParam(); AddUser( user , lItem ); //重新显示内容 } } void DLG_Send::On_User_Del() { CString str; long lCount = m_wndList.GetSelectedCount(); long * pDel = new long[lCount+1]; memset( pDel , 0 , sizeof(long)*lCount); POSITION pos = m_wndList.GetFirstSelectedItemPosition(); long i=0; while ( pos ) { pDel[i] = m_wndList.GetNextSelectedItem(pos); i++; } m_wndList.ShowWindow( SW_HIDE ); //为了加快显示速度 for ( i = 0 ; i< lCount ; i++ ) { Send_User user = GetUser(pDel[lCount-i-1]); if ( user.szStatus[0] == '1' ) //发送成功的不能删除 { continue; } m_wndList.DeleteItem( pDel[lCount-i-1] ); //在临时数据库中删除 m_strSort.Del(user.szMobile); } m_wndList.ShowWindow( SW_SHOW ); //为了加快显示速度 delete pDel; m_bModify = true;//已修改过 RefreshListCount(); //刷新显示列表上的记录计数 } void DLG_Send::On_User_Clear() { m_wndList.ShowWindow( SW_HIDE ); //为了加快显示速度 m_wndList.DeleteAllItems(); m_strSort.Clear(); //清空数据 m_bModify = true;//已修改过 m_wndList.ShowWindow( SW_SHOW ); //为了加快显示速度 RefreshListCount(); //刷新显示列表上的记录计数 } void DLG_Send::On_User_Inport() { if ( m_B_ReMobile.GetCheck() ) { int iRet = MessageBox( _T("将要导入发送记录,是否需要判断重复号码?\r\n注:如果需要判断,则导入速度较慢,但可以排除重复号码。") , _T("信息") , MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2); if ( iRet != IDYES ) m_B_ReMobile.SetCheck(false); } m_wndList.ShowWindow(SW_HIDE); //加快显示速度 Inport_Field Field[] = { {_T("姓名"),0,0,-1}, {_T("昵称"),0,1,-1}, //{_T("性别"),0,2,-1}, //{_T("生日"),0,3,-1}, //{_T("公司"),0,4,-1}, //{_T("职务"),0,5,-1}, //{_T("地址"),0,6,-1}, {_T("手机号码"),0,7,-1}, //{_T("电话号码"),0,8,-1}, //{_T("传真号码"),0,9,-1}, //{_T("Email"),0,10,-1}, //{_T("QQ号码"),0,11,-1}, {_T("备注"),0,12,-1}, }; DLG_User_InportP2 dlg(this); dlg.SetParam(&Field[0],sizeof(Field)/sizeof(Inport_Field),2); //DLG_Send_Inport dlg(this); //dlg.SetInport(true); dlg.DoModal(); RefreshListCount(); //刷新显示列表上的记录计数 m_wndList.ShowWindow(SW_SHOW); //加快显示速度 } void DLG_Send::On_User_Inport_LT() { BOOL m_bLongSms=m_B_LongSms.GetCheck(); BOOL m_bReMobile=m_B_ReMobile.GetCheck(); m_B_LongSms.SetCheck(true); m_B_ReMobile.SetCheck(false); DLG_User_Inport_LT dlg(this); if ( dlg.DoModal()==IDOK ) //插入备注 { m_B_ReMobile.SetCheck(m_bReMobile); m_E_Msg.SetWindowText(_T("") ); OnSendInmemo(); } else { //导入不成功,重新恢复原来数据 m_B_LongSms.SetCheck(m_bLongSms); m_B_ReMobile.SetCheck(m_bReMobile); } } void DLG_Send::On_User_Inport_Group_Sms() { m_B_LongSms.SetCheck(true); m_B_ReMobile.SetCheck(false); m_E_Msg.SetWindowText(_T("") ); OnSendInmemo(); } void DLG_Send::On_User_Export() { if ( this->m_pMainFrame->GetUserPurview_HideNum() ) { return ; //隐藏号码的,不允许导出 } DLG_Send_Inport dlg(this); dlg.SetInport(false); dlg.DoModal(); } void DLG_Send::On_User_Status() { } BOOL DLG_Send::PreTranslateMessage(MSG* pMsg) { //此举是为了用户在输入号码时按了回车然后转到输入内容 if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { if ( pMsg->hwnd == m_E_Num ) { OnSendNumadd(); return true; } } if (pMsg->message == WM_KEYUP &&(pMsg->wParam == 'v' || pMsg->wParam =='V') ) { //if ( pMsg->hwnd != m_E_Num && pMsg->hwnd != m_E_Msg && pMsg->hwnd!=m_D_Date && pMsg->hwnd!=m_D_Time ) if ( pMsg->hwnd == m_wndList) { OnSendNumPaste(); return true; } } return CDialog::PreTranslateMessage(pMsg); } void DLG_Send::OnSendNumPaste() { if (!OpenClipboard()) return ; HANDLE hclip; TCHAR *buf=NULL; #ifdef _UNICODE hclip=::GetClipboardData(CF_UNICODETEXT); #else hclip=::GetClipboardData(CF_TEXT); #endif if ( !hclip ) { CloseClipboard(); return ; } buf=(TCHAR*)GlobalLock(hclip); TCHAR szNum[32]={0}; int lNumLen=0; int lMaxNumLen=16; long lLen = _tcslen(buf); long lMobileCount=0; m_wndList.ShowWindow( SW_HIDE ); //加快显示速度 for ( int i=0 ; i='0' && buf[i]<='9' ) { if ( lNumLen<=lMaxNumLen ) { szNum[lNumLen]=buf[i]; lNumLen ++; } bNum = true; } #ifdef _UNICODE if (!bNum && buf[i]>=L'0' && buf[i]<=L'9' ) { if ( lNumLen<=lMaxNumLen ) { szNum[lNumLen]=(buf[i]-L'0')+'0'; lNumLen ++; } bNum = true; } #endif if( !bNum ) { if ( lNumLen>=8 && lNumLen<=lMaxNumLen ) { ExMobileGZM(szNum); //去除国际码 if ( isMobileNum( szNum ) ) //找到新号码 { lMobileCount ++; Send_User user={0}; _tcscpy( user.szMobile , szNum ); AddUser(user); } } lNumLen=0; memset(szNum,0,sizeof(szNum)); } } //最后一个号码还是要处理 if ( lNumLen>=8 && lNumLen<=lMaxNumLen ) { ExMobileGZM(szNum); //去除国际码 if ( isMobileNum( szNum ) ) //找到新号码 { lMobileCount ++; Send_User user={0}; _tcscpy( user.szMobile , szNum ); AddUser(user); } } lNumLen=0; memset(szNum,0,sizeof(szNum)); m_wndList.ShowWindow( SW_SHOW ); //加快显示速度 GlobalUnlock(hclip); CloseClipboard(); RefreshListCount(); //刷新显示列表上的记录计数 } void DLG_Send::OnSendNumadd() { long lLen2=m_E_Num.GetWindowTextLength(); TCHAR * buf = new TCHAR[lLen2+10]; m_E_Num.GetWindowText( buf , lLen2+10 ); if ( _tcslen( buf ) <=0 ) { MessageBox( _T("请先输入要添加的手机号码!") , _T("错误") , MB_ICONWARNING ); m_E_Num.SetFocus(); delete buf; return ; } TCHAR szNum[32]={0}; int lNumLen=0; int lMaxNumLen=20; long lLen = _tcslen(buf); long lMobileCount=0; for ( int i=0 ; i='0' && buf[i]<='9' ) { if ( lNumLen<=lMaxNumLen ) { szNum[lNumLen]=buf[i]; lNumLen ++; } bNum = true; } #ifdef _UNICODE if (!bNum && buf[i]>=L'0' && buf[i]<=L'9' ) { if ( lNumLen<=lMaxNumLen ) { szNum[lNumLen]=(buf[i]-L'0')+'0'; lNumLen ++; } bNum = true; } #endif if( !bNum ) { if ( lNumLen>=8 && lNumLen<=lMaxNumLen ) { ExMobileGZM(szNum); //去除国际码 if ( isMobileNum( szNum ) ) //找到新号码 { lMobileCount ++; Send_User user={0}; _tcscpy( user.szMobile , szNum ); AddUser(user); } } lNumLen=0; memset(szNum,0,sizeof(szNum)); } } //最后一个号码还是要处理 if ( lNumLen>=8 && lNumLen<=lMaxNumLen ) { ExMobileGZM(szNum); //去除国际码 if ( isMobileNum( szNum ) ) //找到新号码 { lMobileCount ++; Send_User user={0}; _tcscpy( user.szMobile , szNum ); AddUser(user); } } lNumLen=0; memset(szNum,0,sizeof(szNum)); m_E_Num.SetWindowText(_T("")); m_E_Num.SetFocus(); if ( lMobileCount <= 0 ) { MessageBox( _T("手机号码输入有误!\r\n多个号码请以\";\"号隔开!") , _T("错误") , MB_ICONWARNING ); } else { RefreshListCount(); //刷新显示列表上的记录计数 } delete buf; } BOOL DLG_Send::List_Save(BOOL bTJ) { if ( !bTJ && !m_bModify ) //没有需要修改的内容,直接返回即可 return true; TCHAR szMsg[1024]={0}; TCHAR szSelect[128]={0}; COleDateTime tTimer; //定时时间 TCHAR szBoxType[8]={0}; m_E_Msg.GetWindowText( szMsg , sizeof(szMsg) ); if ( _tcslen(szMsg) <=0 ) //内容不能为空 { MessageBox(_T("输入的短信内容不能为空!"),_T("错误"),MB_ICONWARNING); m_E_Msg.SetFocus(); return false; } _tcscpy( m_szMsg , szMsg ); ExChar( m_szMsg , _T("\r") ); //去除,防多行 if ( m_wndList.GetItemCount() <= 0 ) { MessageBox(_T("列表里没输入要发送的目标号码!"),_T("错误"),MB_ICONWARNING); return false; } if ( m_lBoxType == 0 ) _tcscpy( szBoxType, _T("0") ); //待发 else _tcscpy( szBoxType, _T("1") ); //已发 memset(&m_tTimer,0,sizeof(m_tTimer)); if ( m_B_DS.GetCheck() ) //定时短信 { SYSTEMTIME t={0}; SYSTEMTIME t1={0}; DateTime_GetSystemtime( m_D_Date.m_hWnd , &t ); DateTime_GetSystemtime( m_D_Time.m_hWnd , &t1 ); t.wHour = t1.wHour; t.wMinute = t1.wMinute; t.wSecond = 0; tTimer = COleDateTime(t); if ( !m_bSendSR && tTimer < COleDateTime::GetCurrentTime() ) //如果不是生日祝福,需要判断时间是否过期 { MessageBox( _T("定时时间不能小于当前时间,请调整!") , _T("错误") , MB_ICONWARNING ); m_D_Date.SetFocus(); return false; } tTimer.GetAsSystemTime( m_tTimer ); //取定时时间 } else { tTimer.SetStatus( COleDateTime::null ); } if ( m_lBoxID ) //有ID,相当于修改 { _stprintf( szSelect , _T("select * from smsbox where BoxID=%d") , m_lBoxID ); BOOL b = m_AdoRS.Open( szSelect ); if ( b && m_AdoRS.GetRecordCount() ) { m_AdoRS.MoveFirst(); m_AdoRS.PutCollect( _T("BoxType") , szBoxType ); m_AdoRS.PutCollect( _T("Msg") , szMsg ); m_AdoRS.PutCollect( _T("Timer") , tTimer ); m_AdoRS.PutCollect( _T("Task") , m_B_Task.GetCheck() ); m_AdoRS.PutCollect( _T("LongSms") , m_B_LongSms.GetCheck() ); m_AdoRS.PutCollect( _T("FD") , m_B_FD.GetCheck() ); m_AdoRS.Update(); } m_AdoRS.Close(); //删除所有原已有记录 if ( m_bModify ) //没做过修改,不用修改smsitem { _stprintf( szSelect , _T("delete from smsitem where BoxID=%d") , m_lBoxID ); b = m_AdoRS.Open( szSelect ); } } else { //新增 BOOL b = m_AdoRS.Open( _T("smsbox") , adCmdTable ); if ( b ) { m_AdoRS.AddNew(); m_AdoRS.PutCollect( _T("BoxType") , szBoxType ); m_AdoRS.PutCollect( _T("Msg") , szMsg ); m_AdoRS.PutCollect( _T("Timer") , tTimer ); SYSTEMTIME t;::GetLocalTime(&t); COleDateTime ot(t); m_AdoRS.PutCollect( _T("CreateTime") ,ot ); m_AdoRS.Update(); m_AdoRS.GetCollect( _T("BoxID") , m_lBoxID ); //取得新增的BoxID } m_AdoRS.Close(); } if ( !m_bModify ) //没做过修改,不用修改smsitem { return true; } //启用保存Item的线程 m_bSaveList = true; //::AfxBeginThread((AFX_THREADPROC)AutoSaveItem,(LPVOID)this,THREAD_PRIORITY_NORMAL/*THREAD_PRIORITY_BELOW_NORMAL*/); ::AfxBeginThread((AFX_THREADPROC)AutoSaveItem,(LPVOID)this,THREAD_PRIORITY_BELOW_NORMAL); Sleep(500); //秒为延时一会 /* //将Item添中取BoxItem BOOL b = m_AdoRS.Open( "smsitem" , adCmdTable ); if ( b ) { long lCount = m_wndList.GetItemCount(); Send_User user; for ( int i = 0 ; i< lCount ; i++ ) { user = GetUser(i); m_AdoRS.AddNew(); m_AdoRS.PutCollect( "BoxID" , m_lBoxID ); m_AdoRS.PutCollect( "GroupID" , user.szGroup ); m_AdoRS.PutCollect( "Name" , user.szName ); m_AdoRS.PutCollect( "NikeName" , user.szNickName ); m_AdoRS.PutCollect( "Mobile" , user.szMobile ); m_AdoRS.PutCollect( "BZ" , user.szBZ ); m_AdoRS.PutCollect( "Status" , user.szStatus ); //m_AdoRS.PutCollect( "SendID" , user.lSendID ); m_AdoRS.Update(); m_AdoRS.GetCollect( "ItemID" , user.lItemID ); //取新的ItemId m_wndList.SetItemData( i , user.lItemID ); //设置新的ItemID; } m_AdoRS.Close(); } //因为保存了新内容,所以要刷新显示列表 if ( m_lBoxType == 0 ) m_pMainFrame->m_pBaseView->m_dlgSmsDF.RefreshInfo();//待发 else m_pMainFrame->m_pBaseView->m_dlgSmsYF.RefreshInfo();//已发 */ m_bModify = false; //保存完毕,没有要修改的内容 return true; } Send_User DLG_Send::GetUser(long lItem , BOOL bDelay) { Send_User user={0}; TCHAR szStatus[16]={0}; m_wndList.GetItemText( lItem , 0 , user.szName , sizeof(user.szName)-1); m_wndList.GetItemText( lItem , 1 , user.szNickName , sizeof(user.szNickName)-1 ); m_wndList.GetItemText( lItem , 2 , user.szMobile , sizeof(user.szMobile)-1 ); m_wndList.GetItemText( lItem , 3 , szStatus , sizeof(szStatus)-1 ); m_wndList.GetItemText( lItem , 4 , user.szGroup , sizeof(user.szGroup)-1 ); m_wndList.GetItemText( lItem , 5 , user.szBZ , sizeof(user.szBZ)-1 ); user.lItemID = m_wndList.GetItemData( lItem ); /* if ( !bDelay ) { user.lItemID = m_wndList.GetItemData( lItem ); } else { for ( int i=0 ; i<20 ; i++ ) //延时2秒,防止取不取ID; { user.lItemID = m_wndList.GetItemData( lItem ); if ( user.lItemID>0 ) { break; } Sleep(100); } } */ if ( !_tcscmp(szStatus,_T("提交成功")) || !_tcscmp(szStatus,_T("发送成功")) ) _tcscpy(user.szStatus , _T("1") ); else if ( !_tcscmp(szStatus,_T("提交失败")) ) _tcscpy(user.szStatus , _T("2") ); else if ( !_tcscmp(szStatus,_T("已提交")) ) _tcscpy(user.szStatus , _T("3") ); else _tcscpy(user.szStatus , _T("0") ); //未发 return user; } BOOL DLG_Send::List_Read(long lBoxID) { if ( IsSend() ) //判断是否在正在发送短信 return false; if ( lBoxID == m_lBoxID ) //要打开的ID与已读入的ID相同,不必重做 return true; if (!CloseList()) return false; //读入基本信息 TCHAR szSelect[128]={0}; TCHAR szBuf[1024]={0}; COleDateTime ot; _stprintf( szSelect , _T("select * from smsbox where BoxID=%d") , lBoxID ); BOOL b = m_AdoRS.Open( szSelect ); long lCount=m_AdoRS.GetRecordCount(); if ( b && lCount>0 ) { m_AdoRS.MoveFirst(); m_AdoRS.GetCollect( _T("BoxType") , szBuf ); m_lBoxType = _ttol(szBuf); m_AdoRS.GetCollect( _T("Msg") , szBuf ); m_E_Msg.SetWindowText( szBuf ); m_AdoRS.GetCollect( _T("Timer") , ot ); if ( ot.GetStatus() == COleDateTime::valid ) //有效时间 { m_B_DS.SetCheck( true ); SYSTEMTIME t; ot.GetAsSystemTime( t ); DateTime_SetSystemtime( m_D_Date.m_hWnd , GDT_VALID , &t ); DateTime_SetSystemtime( m_D_Time.m_hWnd , GDT_VALID , &t ); if ( ot.GetDay()==1960 && ot.GetMonth()==7 && ot.GetDay()==31 ) //生日发送标志 { SetListSR(true); } else { SetListSR(false); } } else { m_B_DS.SetCheck( false ); SYSTEMTIME t;::GetLocalTime(&t); DateTime_SetSystemtime( m_D_Date.m_hWnd , GDT_VALID , &t ); DateTime_SetSystemtime( m_D_Time.m_hWnd , GDT_VALID , &t ); } long lb; m_AdoRS.GetCollect(_T("Task") , lb ); m_B_Task.SetCheck(lb); m_AdoRS.GetCollect(_T("LongSms") , lb ); m_B_LongSms.SetCheck(lb); m_AdoRS.GetCollect(_T("FD") , lb ); m_B_FD.SetCheck(lb); OnSendDs(); //设置定时 OnSendTask2(); if ( m_lBoxType == 1 ) //已发,不让操作,只能查询 { EnableModifyWindow( false ); //不可以修改 m_B_New.EnableWindow(true); //新建与重发是可以的。 m_B_New2.EnableWindow(true); //新建与重发是可以的。 } else { EnableModifyWindow( true ); //可以修改 } _stprintf( szSelect , _T("select * from smsitem where BoxID=%d") , lBoxID ); m_wndList.ShowWindow(SW_HIDE); m_wndList.DeleteAllItems(); //没有列表 //删除临时数据库 m_strSort.Clear(); //清空数据 m_wndList.ShowWindow(SW_SHOW); b = m_AdoRS.Open( szSelect ); lCount=m_AdoRS.GetRecordCount(); if ( b && lCount>0 ) { if ( m_B_ReMobile.GetCheck() && lCount>MAX_SENDLIST_NOTIP ) { int iRet = MessageBox( _T("准备读取的记录数过大,是否需要判断重复号码?\r\n注:如果需要判断,则读取速度较慢,但可以排除重复号码。") , _T("信息") , MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2); if ( iRet != IDYES ) m_B_ReMobile.SetCheck(false); } m_wndList.ShowWindow( SW_HIDE ); //加快显示速度 CAdoSmsItem adoSms; m_AdoRS.RecordBinding( adoSms ); m_AdoRS.MoveFirst(); while( !m_AdoRS.IsEOF() ) { Send_User user={0}; /* m_AdoRS.GetCollect( "GroupID" , user.szGroup ); m_AdoRS.GetCollect( "Name" , user.szName ); m_AdoRS.GetCollect( "NikeName" , user.szNickName ); m_AdoRS.GetCollect( "Mobile" , user.szMobile ); m_AdoRS.GetCollect( "BZ" , user.szBZ ); m_AdoRS.GetCollect( "Status" , user.szStatus ); m_AdoRS.GetCollect( "SendID" , user.lSendID ); m_AdoRS.GetCollect( "SendID" , user.lItemID ); */ _tcscpy(user.szGroup , adoSms.m_GroupID ); _tcscpy(user.szName , adoSms.m_Name ); _tcscpy(user.szNickName , adoSms.m_NickName ); _tcscpy(user.szMobile , adoSms.m_Mobile ); _tcscpy(user.szBZ , adoSms.m_BZ ); _tcscpy(user.szStatus , adoSms.m_Status ); user.lSendID = adoSms.m_SendID; user.lItemID = adoSms.m_ItemID; memset(&adoSms,0,sizeof(adoSms)); m_AdoRS.MoveNext(); AddUser(user); } m_wndList.ShowWindow( SW_SHOW ); //加快显示速度 } RefreshTJ(); //刷新显示字数 RefreshListCount(); //刷新显示列表上的记录计数 m_lBoxID = lBoxID; m_bModify = false; //刚刚读入,不需要修改 this->SetFocus(); return true; } else { return false; } return false; } void DLG_Send::AddUser(Send_User user,long lItem) { ExChar(user.szMobile,_T(" ")); ExChar(user.szMobile,_T("\r")); ExChar(user.szMobile,_T("\n")); ExChar(user.szMobile,_T("\t")); if ( CString(user.szNickName) != CString(_T("任务号码组")) ) //任务方式 { ExMobileGZM(user.szMobile); //去除国际码 //if ( !isMobileNum( user.szMobile ) ) //不是手机号码,不用添加或修改 if ( !isMmsNum( user.szMobile ) ) //不是手机号码,不用添加或修改,不支持小灵通了 return ; } else { if ( !m_B_Task.GetCheck() ) { m_B_Task.SetCheck(true); OnSendTask(); m_B_Task.EnableWindow(false); } if ( m_B_Task.GetCheck() ) { //为任务模式 m_B_Task.SetCheck(true); m_B_Task.EnableWindow(false); } else { return; } } //判断是否黑名单 if ( lItem < 0 ) { if ( this->IsLocakBack(user.szMobile ) && (m_bBackReMobile || m_lBackReMobileType==0) ) //需要显示警告,或者自动过滤 { if ( m_bBackReMobile ) { CString str; str.Format( _T("%s,%s"),user.szName , user.szMobile); DLG_AddBack dlg(str,this); //提示重复号码 dlg.DoModal(); m_bBackReMobile = dlg.m_bShowReMobile; m_lBackReMobileType = dlg.m_lReMobileType; } if ( m_lBackReMobileType==0 ) //自动过滤 return; } } if (m_pMainFrame->m_Setup.bAutoGetName && _tcslen(user.szName) <= 0) //从通讯录取姓名 { CString strSelect; BOOL bGetAddress = false; //接收到新的短信,先查询其在电话本里的姓名 if (!bGetAddress && m_pMainFrame->GetUserPurview(PURVIEW_PADDRESS, false)) //有私人电话本查看权限 { strSelect.Format(_T("select * from paddress where Mobile like '%%%s'"), user.szMobile); if (m_AdoRS2.Open(strSelect) && !m_AdoRS2.IsEOF()) { m_AdoRS2.GetCollect(_T("Name"), user.szName); m_AdoRS2.GetCollect(_T("NickName"), user.szNickName); m_AdoRS2.GetCollect(_T("BZ"), user.szBZ); bGetAddress = true; } } if (!bGetAddress && m_pMainFrame->GetUserPurview(PURVIEW_GADDRESS_SEE, false)) //有公用电话本查看权限 { strSelect.Format(_T("select * from gaddress where Mobile like '%%%s'"), user.szMobile); if (m_AdoRS2.Open(strSelect) && !m_AdoRS2.IsEOF()) { m_AdoRS2.GetCollect(_T("Name"), user.szName); m_AdoRS2.GetCollect(_T("NickName"), user.szNickName); m_AdoRS2.GetCollect(_T("BZ"), user.szBZ); } } } BOOL bInsert=false; if ( lItem < 0 ) { if ( m_B_ReMobile.GetCheck() && (m_bShowReMobile || m_lReMobileType==0) ) //需要显示警告,或者自动过滤 { bInsert = true; if ( !m_strSort.Add(user.szMobile) ) { if ( m_bShowReMobile ) { CString str; str.Format( _T("%s,%s"),user.szName , user.szMobile); DLG_AddWarning dlg(str,this); //提示重复号码 dlg.DoModal(); m_bShowReMobile = dlg.m_bShowReMobile; m_lReMobileType = dlg.m_lReMobileType; } if ( m_lReMobileType==0 ) //自动过滤 return; } } lItem = m_wndList.GetItemCount(); if ( m_B_Task.GetCheck() && lItem>=100 ) //任务方式不能超过100个号码 { MessageBox(_T("当前为任务模式,最多只允许添加100个号码,超出的将会被丢弃!\r\n如需发送私人通讯录数据,建议使用普通模式。"), _T("警告"), MB_ICONWARNING); return ; } m_wndList.InsertItem( lItem , user.szName ); //插入到临时数据库 if ( !bInsert ) { m_strSort.Add(user.szMobile); } } else { //修改数据库 CString str,strMobile; strMobile = m_wndList.GetItemText(lItem,2); if ( strMobile != CString(user.szMobile) ) { if ( !m_strSort.Add(user.szMobile) ) //加入成功,否则为重复 { if ( m_bShowReMobile ) { CString str; str.Format( _T("%s,%s"),user.szName , user.szMobile); DLG_AddWarning dlg(str,this); //提示重复号码 dlg.DoModal(); m_bShowReMobile = dlg.m_bShowReMobile; m_lReMobileType = dlg.m_lReMobileType; } if ( m_lReMobileType==0 ) //自动过滤 return; } } m_wndList.SetItemText( lItem,0,user.szName ); } m_wndList.SetItemText( lItem,1,user.szNickName ); m_wndList.SetItemText( lItem,2,user.szMobile ); if ( user.szStatus[0] == '1' ) m_wndList.SetItemText( lItem,3,_T("提交成功")); else if ( user.szStatus[0] == '2' ) m_wndList.SetItemText( lItem,3,_T("提交失败")); else if ( user.szStatus[0] == '3' ) m_wndList.SetItemText( lItem,3,_T("已提交")); else m_wndList.SetItemText( lItem,3,_T("未发")); m_wndList.SetItemText( lItem,4,user.szGroup ); m_wndList.SetItemText( lItem,5,user.szBZ ); m_wndList.SetItemData( lItem,user.lItemID); m_bModify = true; } void DLG_Send::OnDblclkSendList(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; On_User_Modify(); } void DLG_Send::OnDatetimechangeSendDsD(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; m_bModify = true;//已修改过 } void DLG_Send::OnDatetimechangeSendDsT(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; m_bModify = true;//已修改过 } void DLG_Send::OnSendNew() { List_New(); } long DLG_Send::GetBoxID() { return m_lBoxID; } void DLG_Send::AddLoveToMsg(TCHAR *pLove) { m_E_Msg.SendMessage(EM_REPLACESEL,false,(LPARAM)(LPCTSTR)pLove); m_bModify = true; } void DLG_Send::OnSendIname() { AddLoveToMsg( _T("\"%Name%\"") ); } void DLG_Send::OnSendInicename() { AddLoveToMsg( _T("\"%NickName%\"") ); } void DLG_Send::OnSendInmemo() { AddLoveToMsg( _T("\"%Memo%\"") ); } void DLG_Send::OnSendIfalsh() { AddLoveToMsg( _T("\"%^%\"") ); } void DLG_Send::OnSendYl() { } BOOL DLG_Send::List_ReSend(long lBoxID) { if ( IsSend() ) //判断是否在正在发送短信 return false; if (!List_Read(lBoxID)) return false; EnableModifyWindow( true ); //可以修改 if ( m_B_Task.GetCheck() ) //如果是任务模式,重新读入后里面肯定有批量号码,所以不能再更改为非任务模式 m_B_Task.EnableWindow(false); OnSendDs(); //设置定时 RefreshTJ(); //刷新显示字数 OnSendTask2(); //刷新任务模式 m_wndList.ShowWindow( SW_HIDE ); //加快显示速度 long lCount = m_wndList.GetItemCount(); //将全部内容置为未发 for ( int i = 0 ; i< lCount ; i++ ) { m_wndList.SetItemText( i,3,_T("未发")); } m_wndList.ShowWindow( SW_SHOW ); //加快显示速度 m_lBoxID = 0; //未保存 m_lBoxType = 0; //待发 m_bModify = true; //已修改 this->SetFocus(); return true; } void DLG_Send::EnableModifyWindow(BOOL bModify) { m_B_DS.EnableWindow( bModify ); m_D_Date.EnableWindow( bModify ); m_D_Time.EnableWindow( bModify ); m_E_Msg.SetReadOnly( !bModify ); m_E_Num.EnableWindow( bModify ); m_B_Add.EnableWindow( bModify ); m_B_Start.EnableWindow( bModify ); m_B_Save.EnableWindow( bModify ); m_B_DY.EnableWindow( bModify ); m_B_GetMsg.EnableWindow( bModify ); m_B_Memo.EnableWindow(bModify); m_B_NickName.EnableWindow(bModify); m_B_Name.EnableWindow(bModify); m_B_Flash.EnableWindow(bModify); m_B_New.EnableWindow(bModify); m_B_New2.EnableWindow(bModify); m_L_lInterval.EnableWindow(bModify); m_B_Task.EnableWindow(bModify); if ( m_pMainFrame->m_Ans_Login2.lLongSmsType==0 ) { m_B_LongSms.EnableWindow(bModify); } if ( m_pMainFrame->m_Ans_Login2.lLongSmsType==1 ) { m_B_FD.EnableWindow(false); //如果强制了使用长短信,则不能使用分段了 } else { m_B_FD.EnableWindow(bModify); } if ( !m_pMainFrame->GetUserPurview( PURVIEW_SENDP , false ) ) { m_E_Num.EnableWindow( false ); //没有发送私人电话本的权限 m_B_Add.EnableWindow( false ); } } int DLG_Send::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; m_UserDrop.Register(this); return 0; } LRESULT DLG_Send::OnDrop(WPARAM wParam, LPARAM lParm) { if ( m_lBoxType== 1 ) //已发列表不能编辑 { MessageBox( _T("对不起,已发的列表不能再添加发送号码!") , _T("错误") , MB_ICONWARNING ); return false; } // if ( !m_pMainFrame->GetUserPurview(PURVIEW_SENDG) ) // return false; COleDataObject * pData = (COleDataObject *)wParam; UINT iCF = ::RegisterClipboardFormat( _T("CORPSMS_USER") ); if( pData->IsDataAvailable( iCF ) ) { HGLOBAL hMem = pData->GetGlobalData( iCF ); BYTE * lp = (BYTE *)GlobalLock((HGLOBAL) hMem);//lock source if (lp != NULL) { long lCount = *(long *)lp; Send_User * pUser = (Send_User *)(lp+sizeof(long)); if (m_B_Task.GetCheck() && CString(pUser[0].szGroup) != CString(_T("公用通讯录"))) { long lItem = m_wndList.GetItemCount(); if (lItem + lCount> 100) { MessageBox(_T("当前为任务模式,最多只允许添加100个号码,超出的将会被丢弃!\r\n如需发送私人通讯录数据,建议使用普通模式。"), _T("警告"), MB_ICONWARNING); lCount = 100 - lItem; if (lCount < 0) lCount = 0; } } m_wndList.ShowWindow( SW_HIDE ); //加快显示速度 for ( int i = 0 ; iMAX_SENDLIST_NOTIP ) { int iRet = MessageBox( _T("准备添加的记录数过大,是否需要判断重复号码?\r\n注:如果需要判断,则添加速度较慢,但可以排除重复号码。") , _T("信息") , MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2); if ( iRet != IDYES ) m_B_ReMobile.SetCheck(false); } if ( m_lBoxType == 1 ) //如果是查看已发短信,直接新建新的短信列表 List_New(); if (m_B_Task.GetCheck()) { long lItem = m_wndList.GetItemCount(); if (lItem + lCount > 100) { MessageBox(_T("当前为任务模式,最多只允许添加100个号码,超出的将会被丢弃!\r\n如需发送私人通讯录数据,建议使用普通模式。"), _T("警告"), MB_ICONWARNING); lCount = 100 - lItem; if (lCount < 0) lCount = 0; } } m_wndList.ShowWindow( SW_HIDE ); //加快显示速度 for ( int i = 0 ; i< lCount ; i++ ) { AddUser( pUser[i] ); } m_wndList.ShowWindow( SW_SHOW ); //加快显示速度 RefreshListCount(); //刷新显示列表上的记录计数 return true; } BOOL DLG_Send::IsSend() { if ( m_bSend ) { MessageBox( _T("正在发送短信中,此操作无效!") , _T("错误") , MB_ICONWARNING ); } return m_bSend; } void DLG_Send::OnSendStart() { CString str ; long lMaxMsgLen = m_pMainFrame->GetMaxSendMsgLen(); //取允许的最大字符数 if ( m_bSend ) //在发,现停止 { this->SetWindowText( _T("短信发送列表") ); //恢复默认提示信息 m_B_Start.SetUnSelToolTip( _T("立即发送") ); m_B_Start.ActiveToolTip( true ); m_B_Start.SetUnSelBmp( IDB_B_START ); m_B_Start.Invalidate(); m_bSend=false; //不在发送 if ( m_lBoxType == 1 ) //发送完成 { EnableModifyWindow( false ); //不可修改 m_B_New.EnableWindow(true); //新建与重发是可以的。 m_B_New2.EnableWindow(true); //新建与重发是可以的。 } else { //未发送完成,用户手动停止 EnableModifyWindow( true ); //还可修改 m_B_New.EnableWindow(true); //新建与重发是可以的。 m_B_New2.EnableWindow(true); //新建与重发是可以的。 } } else { TCHAR szMsg[1024]={0}; m_E_Msg.GetWindowText( szMsg , sizeof(szMsg) ); if ( _tcslen(szMsg) <=0 ) //内容不能为空 { MessageBox(_T("输入的短信内容不能为空!"),_T("错误"),MB_ICONWARNING); m_E_Msg.SetFocus(); return ; } ExChar( szMsg , _T("\r") ); //去除,防多行 ExChar( szMsg , _T("\1") ); //去除,防多行 m_bNoSupperWord=false; if ( bNoSupperWord(szMsg , str) ) { CString str2; str2.Format( _T("短信内容含有部分手机或地区不支持的字符:%s。\r\n建议修改或先单发测试!是否继续发送?") , str); long lRet = MessageBox( str2, _T("提问") , MB_ICONQUESTION|MB_YESNO ); if ( lRet != IDYES ) return ; m_bNoSupperWord=true; } /* //判断内容是否超长 long lMsgAll=0; long lMsgIndex = 1; TCHAR szTemp[1024]={0}; //if ( isChinese( szMsg,_tcslen(szMsg) ) ) //{ GetSpiltUnicodeMsg( szMsg , szTemp , lMsgIndex , lMaxMsgLen ,lMsgAll); //} //else //{ // GetSpiltAsciiMsg( szMsg , szTemp , lMsgIndex , lMaxMsgLen*2+lMaxMsgLen*2/7 ,lMsgAll); //} if ( lMsgAll > 1 ) */ if ( m_lPage >1 && !m_B_LongSms.GetCheck() && !m_B_FD.GetCheck() ) { //_stprintf(szTemp,_T("短信内容过长,将会被分成%d段发送,是否继续?") ,lMsgAll ); str = _T("短信内容将要被拆分多段发送,需按实际条数进行扣费,是否继续?"); long lRet = MessageBox( str, _T("提问") , MB_ICONQUESTION|MB_YESNO ); if ( lRet != IDYES ) return ; } if ( !List_Save(true) ) //保存失败,返回 return; #ifdef SUPPER_IM_MAS if ( Mas_Enable() ) //是否启用Mas { if ( !Mas_Init() ) //是否已初始化Mas return ; } m_Mas_MobsetEnd=false; //短信易是否发完 m_Mas_MasEnd=false; //Mas是否发完 m_Mas_SendOK = 0; #endif m_bSend = true; //开始发送 EnableModifyWindow( false ); //因为发送可以修改 m_B_Start.SetUnSelToolTip( _T("停止发送") ); m_B_Start.ActiveToolTip( true ); m_B_Start.SetUnSelBmp( IDB_B_STOP ); m_B_Start.Invalidate(); m_B_Start.EnableWindow( true ); //允许用户手动停止发送 m_lSendIndex = 0; m_lSendOK = 0; m_bShowFiltWarning = true; //允许显示过滤警告 m_bShowFiltFirst = true; //第一次显示过滤警告 m_bFilt = false; //是否含有过滤关键字 m_bFiltOver = false; //是否需要过量审核 m_dwBackCount=0; //黑名单数量 m_dwNoSupCount=0; //不支持号码数量 m_dwNoMsgCount=0; //没内容数量 memset( m_szSendMsg , 0 , sizeof(m_szSendMsg) ); //还没发送,没有发送内容 //记录发送间隔 m_lInterval = 0; m_L_lInterval.GetWindowText(str); m_lInterval = _ttol(str); //判断是否需要通知管理员,此用户发送大于限定值的短信 long lCount = m_wndList.GetItemCount(); if ( m_B_Task.GetCheck() ) { //以下为发送批量短信 long lSize = sizeof(REQ_PLTaskSms_Add) + sizeof(ANS_PLTaskSms_AddData)*lCount; BYTE * pData = new BYTE[lSize]; memset(pData , 0 , lSize ); REQ_PLTaskSms_Add * pAdd = (REQ_PLTaskSms_Add *)pData; ANS_PLTaskSms_AddData * pAddData = (ANS_PLTaskSms_AddData *)(pData+sizeof(REQ_PLTaskSms_Add)); pAdd->lCorpID = this->m_pMainFrame->m_lCorpID; pAdd->lUserID = this->m_pMainFrame->m_lUserID; _tcscpy(pAdd->szMsg , szMsg ); pAdd->tTimer = m_tTimer; pAdd->lLongSms = m_B_LongSms.GetCheck(); pAdd->lFD = m_B_FD.GetCheck(); pAdd->lCount = lCount; //项目数量 pAdd->lMobileCount = 0; //号码数量 CString str; for ( int i=0 ;iszMobileName , sizeof(pAddData->szMobileName) ); str = m_wndList.GetItemText(i, 1); pAddData->lType = 0; //普通号码 if ( str == CString(_T("任务号码组")) ) { str = m_wndList.GetItemText(i, 4); if ( str == CString(_T("号码文件")) ) { pAddData->lType = 1; //号码文件 } if ( str == CString(_T("公用通讯录")) ) { pAddData->lType = 2; //公用通讯录 } } if ( pAddData->lType == 0 ) m_wndList.GetItemText(i , 2 , pAddData->szMobileID , sizeof(pAddData->szMobileID) ); //号码 else m_wndList.GetItemText(i , 5 , pAddData->szMobileID , sizeof(pAddData->szMobileID) ); //号码 if ( pAddData->lType==0 ) { pAddData->lMobileCount = 1; } else { str = m_wndList.GetItemText(i, 2); pAddData->lMobileCount = _ttol(str); } pAdd->lMobileCount += pAddData->lMobileCount; pAddData ++; } //判断过滤关键字 if ( !bFilt( szMsg , pAdd->lMobileCount ) ) //过滤信息 { if ( m_bSend ) { OnSendStart(); //停止 } delete pData; return ; } pAdd->lFilt = m_bFilt; _tcscpy(pAdd->szFiltWord , m_strFiltWord ); pAdd->lUserAudit =0; //是否需要用户审核 if ( m_pMainFrame->GetUserPurview(PURVIEW_PL_AUDIT,false) && !m_pMainFrame->GetUserPurview(PURVIEW_PL_VERIFY,false)) //需审核,但他不是审核者,就需要先审核后发送 pAdd->lUserAudit =1; m_pMainFrame->SendFrame(SMSFUNC_PLTASKSMS_ADD , pData , lSize); m_dwSendStartTime = GetTickCount(); } else { //以下为发送短信 if ( _tcscmp(m_szMsg,m_szMsgEndFilt) ) //两信息不同时,检查是否需要通知管理员客户发送了大量信息。 { if ( m_pMainFrame->m_Ans_Login.lFiltStep>0 ) { long lFiltCount = m_pMainFrame->m_Ans_Login.lFiltStep; if ( m_pMainFrame->m_Ans_Login.lOverBegin>=0 && m_pMainFrame->m_Ans_Login.lOverEnd>=0 && m_pMainFrame->m_Ans_Login.lOverPercent>=0 ) { SYSTEMTIME t;GetLocalTime(&t); if ( t.wHour < m_pMainFrame->m_Ans_Login.lOverBegin || t.wHour > m_pMainFrame->m_Ans_Login.lOverEnd ) { if ( m_pMainFrame->m_Ans_Login.lOverPercent>0 ) lFiltCount = lFiltCount*m_pMainFrame->m_Ans_Login.lOverPercent/10; } } if ( lFiltCount<=lCount ) { _tcscpy(m_szMsgEndFilt,m_szMsg); REQ_FiltStep * pStep = new REQ_FiltStep; memset(pStep , 0 , sizeof(REQ_FiltStep)); pStep->lCorpID = m_pMainFrame->m_lCorpID; pStep->lUserID = m_pMainFrame->m_lUserID; pStep->lSendCount=lCount; //发送数据 memcpy( pStep->szLoginName , m_pMainFrame->m_pCurUser->szUser,15); memcpy(pStep->szMsg , szMsg , sizeof(TCHAR)*480 ); CString strCM; BOOL bCMFirst = m_pMainFrame->GetQJCM(strCM); _tcscat(pStep->szMsg,strCM); //_tcscpy(pStep->szMsg , szMsg ); m_pMainFrame->SendFrame( SMSFUNC_FILTSTEP , (BYTE*)pStep , sizeof(REQ_FiltStep) ); if ( m_pMainFrame->m_Ans_Login.lOverFilt ) { m_bFiltOver = true; //MessageBox( _T("由于你提交的短信数量过多,需要管理员审核后才能真正发送!"),_T("提示信息"),MB_ICONINFORMATION); } } } } else { m_bFiltOver = true; } if ( m_B_SaveSendLog.GetCheck() && lCount>MAX_SENDLIST_NOTIP ) { int iRet = MessageBox( _T("准备发送的记录数过大,是否记录发送日志?\r\n注:记录发送日志的速度稍慢,但可以根据日志查询状态。") , _T("信息") , MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2); if ( iRet != IDYES ) m_B_SaveSendLog.SetCheck(false); } //判断是否为点对点短信,采用哪种方式进行发送 m_bOneToOne=false; CString csTemp = m_szMsg; CString strCM; BOOL bCMFirst = m_pMainFrame->GetQJCM(strCM); csTemp.Replace( strCM , _T("") ); //删除短信中原有的强制签名,重新生成过 _tcscpy(m_szMsg,csTemp); m_bOneToOne = csTemp.Find( _T("\"%Name%\""))>=0; m_bOneToOne = m_bOneToOne || csTemp.Find( _T("\"%NickName%\""))>=0; m_bOneToOne = m_bOneToOne || csTemp.Find( _T("\"%Memo%\""))>=0; if ( !m_bFiltOver && !bFilt( m_szMsg ) ) //过滤信息 { if ( m_bSend ) { OnSendStart(); //停止 } return ; } m_dwSendStartTime = GetTickCount(); SetTimer( 10 , 200 , NULL ); //启动发送 // SendNextSms(); } } } void DLG_Send::SendNextSms() { long lMaxOneSendMobile=100; //每次最多发送的号码 long lMaxOneSendMsg=1020; //每次最多发送的短信内容长度 long lCMLen=0; long lMaxMsgLen_LongSms=0; long lMaxMsgLen = m_pMainFrame->GetMaxSendMsgLen(); //取允许的最大字符数 if ( m_B_LongSms.GetCheck() ) //长短信 { lMaxMsgLen_LongSms = m_pMainFrame->GetMaxSendMsgLen_longSms(lCMLen); //长短信的最大字符数 } CString strCM; BOOL bCMFirst = m_pMainFrame->GetQJCM(strCM); long lMaxSendCount = 10; long lSpeed = m_pMainFrame->m_Setup.lSendSpeed; if ( lSpeed <= 0 ) lMaxSendCount = 1; if ( lSpeed == 1 ) lMaxSendCount = 5; if ( lSpeed > 1 ) lMaxSendCount = 10 +(lSpeed-2)*10; if ( lMaxSendCount>lMaxOneSendMobile ) { MessageBox(_T("发送异常1,请与管理员联系!") , _T("错误") , MB_ICONWARNING ); return ; } if ( m_pMobileMsg == NULL ) //手机号码的分段 { m_pMobileMsg = new CStringArray(); if ( m_pMobileMsg ) m_pMobileMsg->SetSize(lMaxOneSendMobile); } if ( m_pSendData == NULL ) { m_pSendData = new REQ_SendData3[lMaxOneSendMobile]; } if ( !m_pMobileMsg || !m_pSendData ) { MessageBox(_T("发送异常2,请与管理员联系!") , _T("错误") , MB_ICONWARNING ); return ; } for ( int i=0 ; iSetAt(i,CString(_T(""))); memset(m_pSendData , 0 , sizeof(REQ_SendData3)*lMaxOneSendMobile); REQ_Send3 send={0}; m_lSendRand = rand(); send.lRand = m_lSendRand; send.bCMFirst = bCMFirst; send.lCorpID = m_pMainFrame->m_lCorpID; send.lUserID = m_pMainFrame->m_lUserID; send.bLong = m_B_LongSms.GetCheck(); send.bFD = m_B_FD.GetCheck(); send.lMaxMsgLen = lMaxMsgLen; send.lMaxMsgLen_long = lMaxMsgLen_LongSms; send.bCMFirst = bCMFirst; _tcscpy(send.szCM , strCM); send.lMsgLen = 0; if ( !m_bOneToOne ) send.lMsgLen = (_tcslen(m_szMsg)+1)*sizeof(TCHAR); //内容长度 long lCount = m_wndList.GetItemCount(); long lSendCount = 0; long lGet = 0; for ( ; m_lSendIndexm_Setup.szDEF_Name ); //替换姓名 else strSendMsg.Replace( _T("\"%Name%\"") , user.szName ); //替换姓名 if ( _tcslen(user.szNickName)<=0) strSendMsg.Replace( _T("\"%NickName%\"") , m_pMainFrame->m_Setup.szDEF_NickName ); //替换姓名 else strSendMsg.Replace( _T("\"%NickName%\"") , user.szNickName ); //替换昵称 if ( _tcslen(user.szBZ)<=0) strSendMsg.Replace( _T("\"%Memo%\"") , m_pMainFrame->m_Setup.szDEF_BZ ); //替换姓名 else strSendMsg.Replace( _T("\"%Memo%\"") , user.szBZ ); //替换备注 TCHAR szFalsh[8]={0}; szFalsh[0] = 01; //strSendMsg.Replace( _T("\"%^%\"") , szFalsh ); //替换闪烁符 if ( !m_bFiltOver && !bFilt( strSendMsg ) ) //过滤信息 { if ( m_bSend ) { OnSendStart(); //停止 } return ; } } //看是否为黑名单 if ( isBack(user.szMobile) ) { m_wndList.SetItemText( m_lSendIndex , 3 , _T("提交失败") ); m_dwBackCount++; //黑名单数量 continue; } if ( strSendMsg.GetLength()<=0 ) { m_wndList.SetItemText( m_lSendIndex , 3 , _T("提交失败") ); m_dwNoMsgCount++; //内容为空 continue; } m_pMobileMsg->SetAt(lSendCount,strSendMsg); //保存信息 //计算生日定时短信 if ( m_bSendSR ) { SYSTEMTIME t;::GetSystemTime(&t); m_tTimer.wYear = t.wYear; m_tTimer.wMonth = (WORD)_ttol(user.szBZ); m_tTimer.wDay = (WORD)_ttol(user.szBZ+3); //判断生日是否已过,如果已过,下年再提醒 long lNow=t.wMonth*100+t.wDay; long lSR =m_tTimer.wMonth*100+m_tTimer.wDay; if ( lSR0 ) { _tcscpy((TCHAR*)pDataSend , m_szMsg); pDataSend += send.lMsgLen; } for ( int i=0 ; iGetAt(i)); pDataSend += m_pSendData[i].lMsgLen; } } TCHAR szBuf[128]={0}; _stprintf( szBuf , _T("短信发送列表 正在发送... %d/%d") , m_lSendIndex , lCount); this->SetWindowText( szBuf ); //置状态,防重复提交 /* for ( int i=0 ; iSendFrame( SMSFUNC_SEND3 , pData , lSize ); SetTimer( 1 , 60000 , NULL ); //超时检测,35秒发不出算超时 } BOOL DLG_Send::ProcessSocket(Socket_Head_Add *pHead, BYTE *pFrame) { CString str; if ( pHead->lFuncType == SMSFUNC_SEND3) //发送短信返回 { KillTimer( 1 ); //不用超时检查了 ANS_Send3 * pSend = (ANS_Send3 *)pFrame; ANS_SendData3 * pSendData = (ANS_SendData3 *)(pFrame+sizeof(ANS_Send3)); if ( pSend->lCount <= 0 ) { if ( m_bSend ) { OnSendStart(); } #ifdef _UNICODE str.Format(_T("短信提交出错,错误代码:%d。\r\n%s") , pSend->lCount,pSend->szErrMsg ); #else str.Format(_T("短信提交出错,错误代码:%d。") , pSend->lCount ); #endif MessageBox(str , _T("错误") , MB_ICONWARNING ); RefreshStatusAndLog(); return true; } if ( pSend->lRand != this->m_lSendRand || //随机数不同 pSend->lCorpID != this->m_pMainFrame->m_lCorpID || pSend->lUserID != this->m_pMainFrame->m_lUserID ) //非自己提交的短信,不显示 { return true; } for ( int i = 0 ; i< pSend->lCount ; i ++ ) { TCHAR szStatus[2]={0}; if ( pSendData->lItem>=0 ) { //将结果写到列表 if ( pSendData->lStatus == SEND_STATUS_SUB_OK || pSendData->lStatus == SEND_STATUS_SUB_FILT ) { m_wndList.SetItemText( pSendData->lItem , 3 , _T("提交成功") ); szStatus[0] = '1' ; //提交成功 m_lSendOK ++; //提交成功计数 } else { m_wndList.SetItemText( pSendData->lItem , 3 , _T("提交失败") ); szStatus[0] = '2' ; //提交失败 if ( pSendData->lStatus != SEND_STATUS_SUB_NUMNOSUP ) //如果返回不是联通的号码,则不继续发送 { CString strMsg; switch (pSendData->lStatus) { case SEND_STATUS_SUB_USERNOSMS: strMsg.Format(_T("提交短信失败,共已发送%d个号码!\r\n错误原因:你的短信可用量不足,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ); break; case SEND_STATUS_SUB_CORPNOSMS: strMsg.Format(_T("提交短信失败,共已发送%d个号码!\r\n错误原因:企业的短信可用量不足,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; break; case SEND_STATUS_SUB_CORPOVRDATE: strMsg.Format(_T("提交短信失败,共已发送%d个号码!\r\n错误原因:企业已过期,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; break; case SEND_STATUS_OVERCOUNT: strMsg.Format(_T("提交短信失败,共已发送%d个号码!\r\n错误原因:已超当天最大发送量,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; break; case SEND_STATUS_NOSY: strMsg.Format(_T("提交短信失败,共已发送%d个号码!\r\n错误原因:此帐号不支持深夜发送短信,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; break; default: #ifdef _UNICODE strMsg.Format( _T("提交短信失败,共已发送%d个号码!\r\n错误原因:%s\r\n%s"),m_lSendOK,pSend->szErrMsg,GetOtherSendRetMsg() ) ; #else strMsg.Format( _T("提交短信失败,共已发送%d个号码!\r\n错误原因:原因未明,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; #endif break; } if ( m_bSend ) { OnSendStart(); } MessageBox( strMsg , _T("错误") , MB_ICONWARNING ); RefreshStatusAndLog(); return true; } else { m_dwNoSupCount++; //不支持号码数量 } } } else { if ( pSendData->lStatus == SEND_STATUS_SUB_OK || pSendData->lStatus == SEND_STATUS_SUB_FILT ) { szStatus[0] = '1' ; //提交成功 } else { szStatus[0] = '2' ; //提交失败 } } //将结果插入队列,由线程写入数据库 SaveItemStatus * pStatus = new SaveItemStatus; memset(pStatus , 0 , sizeof(SaveItemStatus)); pStatus->lSendID = pSendData->lSendID; _tcscpy(pStatus->szStatus , szStatus ); pStatus->lItemID = pSendData->lItemID; pStatus->lStatus = pSendData->lStatus; pStatus->lKF = pSendData->lKF; _tcscpy(pStatus->szSendNum,pSendData->szSendNum); _tcscpy(pStatus->szName,m_pSendData[i].szName); _tcscpy(pStatus->szMsg,m_pMobileMsg->GetAt(i)); _tcscpy(pStatus->szMobile,m_pSendData[i].szMobile); m_SaveItemStatus.AddTail(pStatus); /* //将结果写到数据库 CString str; str.Format(_T("update smsitem set SendID=%d , Status='%s' where ItemID=%d ") , pSendData->lSendID , szStatus , pSendData->lItemID ); m_AdoRS.Open( str ); */ /* if ( m_B_SaveSendLog.GetCheck() ) { CString strName = pSendData->szName; CString strMsg = pSendData->szMsg; strName.Replace( _T("'"),_T("''")); strMsg.Replace( _T("'"),_T("''")); str.Format(_T("insert into smslog (SendID,SendNum,Recver,RecvNum,Msg,Status,SubTime) values (%d,'%s','%s','%s','%s',%d,now())"), pSendData->lSendID,pSendData->szSendNum,strName,pSendData->szMobile,strMsg,pSendData->lStatus); m_AdoRS.Open( str ); } */ /* //记录发送日志 b = m_AdoRS.Open( _T("smslog") , adCmdTable ); if ( b ) { m_AdoRS.AddNew(); m_AdoRS.PutCollect( _T("SendID") , pSendData->lSendID ); m_AdoRS.PutCollect( _T("SendNum"), pSendData->szSendNum ); m_AdoRS.PutCollect( _T("Recver") , pSendData->szName ); m_AdoRS.PutCollect( _T("RecvNum"), pSendData->szMobile); m_AdoRS.PutCollect( _T("Msg") , pSendData->szMsg ); m_AdoRS.PutCollect( _T("Status") , pSendData->lStatus ); m_AdoRS.PutCollect( _T("SubTime") , COleDateTime::GetCurrentTime() ); //提交时间,当前 m_AdoRS.Update(); m_AdoRS.Close(); } */ pSendData ++; //处理下一条 } if ( m_bSend ) //还在发送,可以发送下一条 SendNextSms(); return true; } if (pHead->lFuncType == SMSFUNC_PLTASKSMS_ADD) { KillTimer(1); //收到返回,不会超时。 ANS_PLTaskSms_Add * pSend = (ANS_PLTaskSms_Add *)pFrame; if ( pSend->lPLTaskSmsID <= 0 ) { if ( m_bSend ) { OnSendStart(); } str.Format( _T("短信任务提交出错,%s。\r\n请转到短信任务刷新验证提交是否成功。") , pSend->szErrMsg); MessageBox(str , _T("错误") , MB_ICONWARNING ); RefreshStatusAndLog(); return true; } else { long lCount=m_wndList.GetItemCount(); for ( int i=0 ; ilFuncType == SMSFUNC_SEND2) //发送短信返回 { KillTimer( 1 ); //不用超时检查了 ANS_Send2 * pSend = (ANS_Send2 *)pHead->pFrame; ANS_SendData2 * pSendData = (ANS_SendData2 *)(pHead->pFrame+sizeof(ANS_Send2)); if ( pSend->lCount <= 0 ) { if ( m_bSend ) { OnSendStart(); } #ifdef _UNICODE str.Format(_T("短信提交出错,错误代码:%d。\r\n%s") , pSend->lCount,pSend->szErrMsg ); #else str.Format(_T("短信提交出错,错误代码:%d。") , pSend->lCount ); #endif MessageBox(str , _T("错误") , MB_ICONWARNING ); RefreshStatusAndLog(); return true; } if ( pSendData->lCorpID != this->m_pMainFrame->m_lCorpID || pSendData->lUserID != this->m_pMainFrame->m_lUserID ) //非自己提交的短信,不显示 { return true; } for ( int i = 0 ; i< pSend->lCount ; i ++ ) { TCHAR szStatus[2]={0}; if ( pSendData->lItem>=0 ) { //将结果写到列表 if ( pSendData->lStatus == SEND_STATUS_SUB_OK || pSendData->lStatus == SEND_STATUS_SUB_FILT ) { m_wndList.SetItemText( pSendData->lItem , 3 , _T("提交成功") ); szStatus[0] = '1' ; //提交成功 m_lSendOK ++; //提交成功计数 } else { m_wndList.SetItemText( pSendData->lItem , 3 , _T("提交失败") ); szStatus[0] = '2' ; //提交失败 if ( pSendData->lStatus != SEND_STATUS_SUB_NUMNOSUP ) //如果返回不是联通的号码,则不继续发送 { CString strMsg; switch (pSendData->lStatus) { case SEND_STATUS_SUB_USERNOSMS: strMsg.Format(_T("提交短信失败,共已发送%d条短信!\r\n错误原因:你的短信可用量不足,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ); break; case SEND_STATUS_SUB_CORPNOSMS: strMsg.Format(_T("提交短信失败,共已发送%d条短信!\r\n错误原因:企业的短信可用量不足,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; break; case SEND_STATUS_SUB_CORPOVRDATE: strMsg.Format(_T("提交短信失败,共已发送%d条短信!\r\n错误原因:企业已过期,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; break; case SEND_STATUS_OVERCOUNT: strMsg.Format(_T("提交短信失败,共已发送%d条短信!\r\n错误原因:已超当天最大发送量,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; break; case SEND_STATUS_NOSY: strMsg.Format(_T("提交短信失败,共已发送%d条短信!\r\n错误原因:此帐号不支持深夜发送短信,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; break; default: #ifdef _UNICODE strMsg.Format( _T("提交短信失败,共已发送%d条短信!\r\n错误原因:%s\r\n%s"),m_lSendOK,pSend->szErrMsg,GetOtherSendRetMsg() ) ; #else strMsg.Format( _T("提交短信失败,共已发送%d条短信!\r\n错误原因:原因未明,请与系统管理员联系!\r\n%s"),m_lSendOK,GetOtherSendRetMsg() ) ; #endif break; } if ( m_bSend ) { OnSendStart(); } MessageBox( strMsg , _T("错误") , MB_ICONWARNING ); RefreshStatusAndLog(); return true; } else { m_dwNoSupCount++; //不支持号码数量 } } } else { if ( pSendData->lStatus == SEND_STATUS_SUB_OK || pSendData->lStatus == SEND_STATUS_SUB_FILT ) { szStatus[0] = '1' ; //提交成功 } else { szStatus[0] = '2' ; //提交失败 } } //将结果插入队列,由线程写入数据库 SaveItemStatus * pStatus = new SaveItemStatus; memset(pStatus , 0 , sizeof(SaveItemStatus)); pStatus->lSendID = pSendData->lSendID; _tcscpy(pStatus->szStatus , szStatus ); pStatus->lItemID = pSendData->lItemID; pStatus->lStatus = pSendData->lStatus; _tcscpy(pStatus->szSendNum,pSendData->szSendNum); _tcscpy(pStatus->szName,pSendData->szName); _tcscpy(pStatus->szMsg,pSendData->szMsg); _tcscpy(pStatus->szMobile,pSendData->szMobile); m_SaveItemStatus.AddTail(pStatus); /* //将结果写到数据库 CString str; str.Format(_T("update smsitem set SendID=%d , Status='%s' where ItemID=%d ") , pSendData->lSendID , szStatus , pSendData->lItemID ); m_AdoRS.Open( str ); */ /* if ( m_B_SaveSendLog.GetCheck() ) { CString strName = pSendData->szName; CString strMsg = pSendData->szMsg; strName.Replace( _T("'"),_T("''")); strMsg.Replace( _T("'"),_T("''")); str.Format(_T("insert into smslog (SendID,SendNum,Recver,RecvNum,Msg,Status,SubTime) values (%d,'%s','%s','%s','%s',%d,now())"), pSendData->lSendID,pSendData->szSendNum,strName,pSendData->szMobile,strMsg,pSendData->lStatus); m_AdoRS.Open( str ); } */ /* //记录发送日志 b = m_AdoRS.Open( _T("smslog") , adCmdTable ); if ( b ) { m_AdoRS.AddNew(); m_AdoRS.PutCollect( _T("SendID") , pSendData->lSendID ); m_AdoRS.PutCollect( _T("SendNum"), pSendData->szSendNum ); m_AdoRS.PutCollect( _T("Recver") , pSendData->szName ); m_AdoRS.PutCollect( _T("RecvNum"), pSendData->szMobile); m_AdoRS.PutCollect( _T("Msg") , pSendData->szMsg ); m_AdoRS.PutCollect( _T("Status") , pSendData->lStatus ); m_AdoRS.PutCollect( _T("SubTime") , COleDateTime::GetCurrentTime() ); //提交时间,当前 m_AdoRS.Update(); m_AdoRS.Close(); } */ pSendData ++; //处理下一条 } if ( m_bSend ) //还在发送,可以发送下一条 SendNextSms(); return true; } return false; } void DLG_Send::OnTimer(UINT_PTR nIDEvent) { CDialog::OnTimer(nIDEvent); if ( nIDEvent == 1 ) { KillTimer( 1 ); if ( m_bSend ) { OnSendStart(); if ( m_pMainFrame->m_Setup.bAutoReSend ) //如果设置了自动重发,则重新发送多一次 { TCHAR szBuf[128]={0}; _stprintf( szBuf , _T("短信发送列表 提交超时,准备重发!")); this->SetWindowText( szBuf ); Sleep(2000); OnSendStart(); } else { MessageBox( _T("提交短信超时,请检查网络连接!") , _T("错误") , MB_ICONWARNING ); } return ; } } if ( nIDEvent == 2 ) { KillTimer(nIDEvent); #ifdef SUPPER_IM_MAS if ( Mas_Enable() ) //是否启用Mas { Mas_Init(); } #endif return; } if ( nIDEvent == 10 ) { KillTimer(nIDEvent); SendNextSms(); #ifdef SUPPER_IM_MAS if ( Mas_Enable() ) //是否启用Mas { ::AfxBeginThread((AFX_THREADPROC)Mas_SendT,(LPVOID)this,/*THREAD_PRIORITY_LOWEST*/THREAD_PRIORITY_BELOW_NORMAL); } #endif return ; } } BOOL DLG_Send::bFilt(const TCHAR *pMsg,long lCount2) { if ( !_tcscmp(m_szMsg,m_szMsgEndFilt) ) //两次审核的短信相同,不用再次审核了 { m_bFilt = true; return true; } BOOL bFilt = false; BOOL bSDisable = false; CString str = pMsg; CString str2; long lLen = _tcslen( pMsg ); TCHAR szWord[30]={0}; TCHAR szByte[8]={0}; long lCount = m_wndList.GetItemCount(); if ( lCount2>=0 ) lCount = lCount2; for ( int i = 0 ; i< m_pMainFrame->m_lFiltCount; i++ ) { if ( m_pMainFrame->m_pFilt[i].lFiltBegin <= lCount && _tcslen(m_pMainFrame->m_pFilt[i].szWord)>0 ) //大于起始点的才开始计算过滤 { _tcscpy( szWord , m_pMainFrame->m_pFilt[i].szWord ); if ( m_pMainFrame->m_pFilt[i].szFilt[0] == '0' ) { //精确过滤 //bFilt = FoundChar( pMsg , szWord , lLen ); //bFilt = FoundChar( pMsg , m_pMainFrame->m_pFilt[i].szWord , lLen ); if ( str.Find(szWord)>=0 ) { bFilt = true; if ( m_bNoSupperWord ) //已提示有不支持的关键字,如果继续发,则敏感字不检查这些内容 { if ( bNoSupperWord(szWord,str2) ) { bFilt = false; //不当作关键字 } } } } else { //模糊过滤 long lSplit=1; long lSplitCount=0; bFilt = true; memset( szByte , 0 , sizeof(szByte) ); while(GetSpiltUnicodeMsg( szWord , szByte , lSplit , 1 , lSplitCount )) { //if ( !FoundChar( pMsg , szByte, lLen ) ) if ( str.Find(szByte)<0 ) { bFilt = false; break; } memset( szByte , 0 , sizeof(szByte) ); lSplit++; } } } if ( bFilt ) //有需要过滤的 { bSDisable = m_pMainFrame->m_pFilt[i].bSDisable; //是否为发即死 break; } } m_bFilt = bFilt; //记录此信息是否含有过滤关键字 m_strFiltWord = szWord; if ( m_bShowFiltWarning && bFilt) { if ( m_bShowFiltFirst ) //第一次出现此信息,通知后台管理员 { m_bShowFiltFirst = false; if (bSDisable || !m_B_Task.GetCheck() ) //任务模式上传任务完成后再通知 { _tcscpy(m_szMsgEndFilt,m_szMsg); REQ_FiltWarning * pWarning = new REQ_FiltWarning; memset(pWarning , 0 , sizeof(REQ_FiltWarning)); pWarning->lCorpID = m_pMainFrame->m_lCorpID; pWarning->lUserID = m_pMainFrame->m_lUserID; pWarning->bSDisable= bSDisable; //是否为发即死 memcpy( pWarning->szLoginName , m_pMainFrame->m_pCurUser->szUser,15); pWarning->lSendCount=lCount; //发送数据 memcpy(pWarning->szMsg,pMsg,sizeof(TCHAR)*500); //_tcscpy(pWarning->szMsg , pMsg ); _tcscpy(pWarning->szFilt , szWord ); pWarning->lTask = m_B_Task.GetCheck(); m_pMainFrame->SendFrame( SMSFUNC_FILTWARNING , (BYTE*)pWarning , sizeof(REQ_FiltWarning) ); } if ( bSDisable ) { MessageBox( _T("由于你发送了重点禁用关键字,你的帐号暂时已被禁用,请与管理员联系!"),_T("错误"),MB_ICONWARNING); Sleep(500); m_pMainFrame->PostMessage( WM_CLOSE ,0,0); //自动关闭 return false; } } m_bShowFiltWarning = false;//继续提交,下次不再警告 /* DLG_FiltWarning dlg(this); dlg.SetParam( pMsg , szWord ); dlg.DoModal(); if ( dlg.GetParam() != 0 ) { if ( dlg.GetParam() == 2 ) //继续提交,下次不再警告 m_bShowFiltWarning = false; return true; } else { return false; } */ } return true; } BOOL DLG_Send::bNoSupperWord(TCHAR *pMsg,CString & strWord) { BOOL bFilt = false; CString str = pMsg; for ( int i = 0 ; i< m_pMainFrame->m_lNoSupperWordCount; i++ ) { if ( str.Find(m_pMainFrame->m_pNoSupperWord[i].szWord)>=0 ) { strWord = m_pMainFrame->m_pNoSupperWord[i].szWord; bFilt = true; break; } } return bFilt; } void DLG_Send::List_SetMsg(TCHAR *pMsg) { m_E_Msg.SetWindowText( pMsg ); RefreshTJ(); //刷新显示字数 } void DLG_Send::OnKeydownSendList(NMHDR* pNMHDR, LRESULT* pResult) { LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR; *pResult = 0; if ( pLVKeyDow->wVKey == VK_DELETE ) { On_User_Del(); } if ( pLVKeyDow->wVKey == VK_INSERT) { On_User_Add(); } if ( pLVKeyDow->wVKey == VK_SPACE) { On_User_Modify(); } if ( pLVKeyDow->wVKey == 'S' || pLVKeyDow->wVKey == 's') { On_User_Status(); } if ( pLVKeyDow->wVKey == 'R' || pLVKeyDow->wVKey == 'r') { On_User_Status(); } if ( pLVKeyDow->wVKey == 'C' || pLVKeyDow->wVKey == 'c') { On_User_Clear(); } if ( pLVKeyDow->wVKey == 'I' || pLVKeyDow->wVKey == 'i') { On_User_Inport(); } if ( pLVKeyDow->wVKey == 'E' || pLVKeyDow->wVKey == 'e') { On_User_Export(); } if ( pLVKeyDow->wVKey == 'A' || pLVKeyDow->wVKey == 'a') { m_wndList.SetItemState(-1, LVIS_SELECTED, LVIS_SELECTED); //全选 //m_wndList.SelectAllItems(); } } void DLG_Send::RefreshStatusAndLog() { //再次点击此类项目后刷新 m_pMainFrame->m_pBaseView->m_dlgSmsDF.m_bRefresh = false; m_pMainFrame->m_pBaseView->m_dlgSmsYF.m_bRefresh = false; m_pMainFrame->m_pBaseView->m_dlgSmsLog.m_bRefresh = false; /* //发送完成,需要刷新列表 m_pMainFrame->m_pBaseView->m_dlgSmsDF.RefreshInfo();//待发 m_pMainFrame->m_pBaseView->m_dlgSmsYF.RefreshInfo();//已发 //发送完成,刷新状态 m_pMainFrame->m_pBaseView->m_dlgSmsLog.RefreshInfo(); //发送日志 */ } void DLG_Send::RefreshListCount() { long lCount = m_wndList.GetItemCount(); CString strMsg; strMsg.Format( _T("发送列表 共有%d条记录") , lCount ); m_S_ListCount.SetWindowText( strMsg ); } void DLG_Send::OnSendDy() { DLG_SmsDY dlg(this); dlg.SetParam( &m_AdoRS ); if ( dlg.DoModal() == IDOK ) { this->AddLoveToMsg( (TCHAR*)(LPCTSTR)dlg.m_strDY ); /* m_E_Msg.SetWindowText(dlg.m_strDY); m_E_Msg.SetSel(m_E_Msg.GetWindowTextLength(),m_E_Msg.GetWindowTextLength()); if ( m_pMainFrame->m_Ans_Login.bCM ) //启用签名 { //this->AddLoveToMsg( _T("\r\n") ); this->AddLoveToMsg( m_pMainFrame->m_Ans_Login.szCM ); } */ this->OnChangeSendMsg(); } } BOOL DLG_Send::isBack(const TCHAR *pMobile) { BOOL bBack = false; for ( int i=0;im_lBackCount;i++ ) { if ( !_tcscmp(m_pMainFrame->m_pBack[i].szMobile , pMobile ) ) { bBack = true; break; } } return bBack; } void DLG_Send::SetListSR(BOOL bSendSR) { //生日祝福专用 m_bSendSR = bSendSR; if ( m_bSendSR ) { m_D_Date.ShowWindow(SW_HIDE); SYSTEMTIME t;::GetLocalTime(&t); //为生日祝福发送标志 t.wYear = 1979; t.wMonth=7; t.wDay = 31; t.wHour= 10; t.wMinute=0; t.wSecond=0; t.wMilliseconds=0; DateTime_SetSystemtime( m_D_Date.m_hWnd , GDT_VALID , &t ); DateTime_SetSystemtime( m_D_Time.m_hWnd , GDT_VALID , &t ); m_B_DS.SetCheck(true); m_D_Time.EnableWindow(true); } else { m_D_Date.ShowWindow(SW_SHOW); } } void DLG_Send::OnSendGetmsg() { DLG_Setup_SZGJ_GetMsg dlg(this); dlg.SetParam( this->m_pMainFrame->m_Setup ); if ( dlg.DoModal() == IDOK ) { m_E_Msg.SetWindowText(dlg.m_strMsg); m_E_Msg.SetSel(m_E_Msg.GetWindowTextLength(),m_E_Msg.GetWindowTextLength()); if ( m_pMainFrame->m_Ans_Login.bCM ) //启用签名 { // this->AddLoveToMsg( _T("\r\n") ); this->AddLoveToMsg( m_pMainFrame->m_Ans_Login.szCM ); } this->OnChangeSendMsg(); } } void DLG_Send::CloseAutoSave(void) { m_bInit = false; } UINT DLG_Send::AutoSaveLog(void *pParam) { DLG_Send * pDlg = (DLG_Send *)pParam; CString str; try { while( pDlg->m_bInit ) { //取队列中的内容并且开发处理 while ( pDlg->m_bInit && !pDlg->m_SaveItemStatus.IsEmpty() ) { SaveItemStatus * pData = pDlg->m_SaveItemStatus.GetHead(); str.Format(_T("update smsitem set SendID=%d , Status='%s' where ItemID=%d ") , pData->lSendID , pData->szStatus , pData->lItemID ); pDlg->m_AdoRS2.Open( str ); if ( pDlg->m_B_SaveSendLog.GetCheck() ) { CString strName = pData->szName; CString strMsg = pData->szMsg; //if ( pDlg->m_B_LongSms.GetCheck() ) //长短信 // strMsg = pData->szMsg+_tcslen(_T("长信4C11:")); strName.Replace( _T("'"),_T("''")); strMsg.Replace( _T("'"),_T("''")); str.Format(_T("insert into smslog (SendID,SendNum,Recver,RecvNum,Msg,Status,SubTime,KF) values (%d,'%s','%s','%s','%s',%d,now(),%d)"), pData->lSendID,pData->szSendNum,strName,pData->szMobile,strMsg,pData->lStatus,pData->lKF); pDlg->m_AdoRS2.Open( str ); } pDlg->m_SaveItemStatus.RemoveHead(); delete pData; Sleep(2); } Sleep(50); } //清除队列中的内容 while (pDlg->m_bInit && !pDlg->m_SaveItemStatus.IsEmpty()) { SaveItemStatus * pData = pDlg->m_SaveItemStatus.GetHead(); pDlg->m_SaveItemStatus.RemoveHead(); delete pData; } } catch(...) { return 0; } return 1; } void DLG_Send::OnDestroy() { m_bInit = false; #ifdef SUPPER_IM_MAS m_Mas_Init = false; #endif Sleep(200); #ifdef SUPPER_IM_MAS if ( m_Mas_Lib ) { (*m_Mas_release)(); //释放接口 FreeLibrary(m_Mas_Lib); m_Mas_Lib = NULL; } #endif if ( m_pMobileMsg ) //手机号码的分段 { delete m_pMobileMsg; m_pMobileMsg = NULL; } if ( m_pSendData ) { delete m_pSendData; m_pSendData = NULL; } CDialog::OnDestroy(); // TODO: Add your message handler code here } UINT DLG_Send::AutoSaveItem(void *pParam) { DLG_Send * pDlg = (DLG_Send *)pParam; CString str; try { //将Item添中取BoxItem BOOL b = pDlg->m_AdoRS3.Open( _T("smsitem") , adCmdTable ); if ( b ) { long lCount = pDlg->m_wndList.GetItemCount(); Send_User user; for ( int i = 0 ; i< lCount && pDlg->m_bInit ; i++ ) { user = pDlg->GetUser(i); pDlg->m_AdoRS3.AddNew(); pDlg->m_AdoRS3.PutCollect( _T("BoxID") , pDlg->m_lBoxID ); pDlg->m_AdoRS3.PutCollect( _T("GroupID") , user.szGroup ); pDlg->m_AdoRS3.PutCollect( _T("Name") , user.szName ); pDlg->m_AdoRS3.PutCollect( _T("NikeName") , user.szNickName ); pDlg->m_AdoRS3.PutCollect( _T("Mobile") , user.szMobile ); pDlg->m_AdoRS3.PutCollect( _T("BZ") , user.szBZ ); pDlg->m_AdoRS3.PutCollect( _T("Status") , user.szStatus ); //m_AdoRS.PutCollect( _T("SendID") , user.lSendID ); pDlg->m_AdoRS3.Update(); pDlg->m_AdoRS3.GetCollect( _T("ItemID") , user.lItemID ); //取新的ItemId pDlg->m_wndList.SetItemData( i , user.lItemID ); //设置新的ItemID; } pDlg->m_AdoRS3.Close(); } if ( pDlg->m_bInit ) { //因为保存了新内容,所以要刷新显示列表 if ( pDlg->m_lBoxType == 0 ) pDlg->m_pMainFrame->m_pBaseView->m_dlgSmsDF.RefreshInfo();//待发 else pDlg->m_pMainFrame->m_pBaseView->m_dlgSmsYF.RefreshInfo();//已发 } pDlg->m_bSaveList = false; } catch(...) { return 0; } return 1; } void DLG_Send::OnSendLongsms() { if ( m_B_LongSms.GetCheck() ) { /* //2025.02.27,不需要再询问长短信的情况 int iRet = MessageBox(_T("将要设置以长短信方式发送短信,长短信有以下特点:\r\n1、分开多条发送的短信在手机屏幕上显示的是一整条。\r\n2、每条拆分的短信比普通短信支持的最大字数少3-4个字。\r\n3、长短信是拆分发送再由手机端组合,某些手机可能无法接收或无法显示长短信。\r\n4、长短信仍会按实际拆分条数进行扣费。\r\n是否继续以长短信方式发送?"),_T("提问") , MB_ICONQUESTION|MB_YESNO); if ( iRet!= IDYES ) { m_B_LongSms.SetCheck(false); } else { m_B_FD.SetCheck(false); } */ m_B_FD.SetCheck(false); } RefreshTJ(); } BOOL DLG_Send::isSendingSms() { return m_bSend; } CString DLG_Send::GetOtherSendRetMsg() { CString str=_T("\r\n\r\n其中:"); CString strTemp; BOOL bFirst=true; if (m_dwBackCount>0 ) { if ( !bFirst ) { str += _T("   "); } else { bFirst = false; } strTemp.Format( _T("黑名单数量:%d\r\n") , m_dwBackCount ); str += strTemp; } if (m_dwNoSupCount>0 ) { if ( !bFirst ) { str += _T("   "); } else { bFirst = false; } strTemp.Format( _T("不支持数量:%d\r\n") , m_dwNoSupCount ); str += strTemp; } if (m_dwNoMsgCount>0 ) { if ( !bFirst ) { str += _T("   "); } else { bFirst = false; } strTemp.Format( _T("内容空数量:%d\r\n") , m_dwNoMsgCount ); str += strTemp; } if ( bFirst ) //没有任何数据 str = _T(""); return str; } void DLG_Send::OnSendNew2() { if ( m_lBoxID<=0 ) return ; CString strTemp = _T("你选择的是\"重新发送\",本任务中所有短信将会被再次重新发送!\r\n") \ _T("是否继续?"); int iRet = MessageBox( strTemp,_T("提问") , MB_ICONQUESTION|MB_YESNO ); if ( iRet != IDYES ) return ; List_ReSend( m_lBoxID ); } void DLG_Send::OnSendFd() { if ( m_B_FD.GetCheck() ) { int iRet = MessageBox(_T("将要设置加入分段标志,加入分段标志有以下特点:\r\n1、分开多条发送的短信自动在前面添加分段标志:1/2、2/2...。\r\n2、添加分段标志后每条短信内容最大长度缩短4个字。\r\n3、添加分段标志后仍是按实际拆分条数进行扣费。\r\n是否继续以添加分段标志方式发送?"),_T("提问") , MB_ICONQUESTION|MB_YESNO); if ( iRet!= IDYES ) { m_B_FD.SetCheck(false); } else { m_B_LongSms.SetCheck(false); } } RefreshTJ(); } BOOL DLG_Send::Mas_Enable() { #ifdef SUPPER_IM_MAS return this->m_pMainFrame->m_Setup.Mas_Enable; #else return false; #endif } BOOL DLG_Send::Mas_Init() { #ifdef SUPPER_IM_MAS if ( m_Mas_Init ) //已初始化 return m_Mas_Init; CString str; //装入函数 m_Mas_Lib=LoadLibrary( _T("ImApi.dll") ); if (!m_Mas_Lib) { MessageBox( _T("Mas装入动态库ImApi.dll失败!无法继续发送!"),_T("错误"),MB_ICONWARNING ); return false; } m_Mas_initWithDB = (MAS_initWithDB)GetProcAddress( m_Mas_Lib , "initWithDB" ); m_Mas_release = (MAS_release)GetProcAddress( m_Mas_Lib , "release" ); m_Mas_sendSMAdvTime= (MAS_sendSMAdvTime)GetProcAddress( m_Mas_Lib , "sendSMAdvTime" ); m_Mas_receiveSM = (MAS_receiveSM)GetProcAddress( m_Mas_Lib , "receiveSM" ); m_Mas_receiveRPT = (MAS_receiveRPT)GetProcAddress( m_Mas_Lib , "receiveRPT" ); if ( !m_Mas_initWithDB || !m_Mas_release || !m_Mas_sendSMAdvTime || !m_Mas_receiveSM || !m_Mas_receiveRPT ) { FreeLibrary(m_Mas_Lib); m_Mas_Lib = NULL; MessageBox( _T("Mas导出ImApi.dll函数失败!无法继续发送!"),_T("错误"),MB_ICONWARNING ); return false; } //初始化 CStringA IP = CW2A(m_pMainFrame->m_Setup.Mas_IP); CStringA User = CW2A(m_pMainFrame->m_Setup.Mas_User); CStringA Passwd = CW2A(m_pMainFrame->m_Setup.Mas_Passwd); CStringA DBName = CW2A(m_pMainFrame->m_Setup.Mas_DBName); CStringA Code = CW2A(m_pMainFrame->m_Setup.Mas_Code); int nResult = (*m_Mas_initWithDB)(IP, User, Passwd,DBName,Code); if(nResult != 0) { FreeLibrary(m_Mas_Lib); m_Mas_Lib = NULL; str.Format( _T("Mas初始化失败,错误代码:%d,无法继续发送!") , nResult); MessageBox(str,_T("错误"),MB_ICONWARNING ); return false; } //初始化号段表 //取得共用参数 //连接到号段表 TCHAR szPath[512]={0}; m_pMainFrame->GetCurrentPath( szPath ); _tcscat( szPath , _T("SMSData.dat") ); //数据库文件名 //解密码 char szPasswd[64]={0};strcpy(szPasswd , ACCESS_PASSWD ); char szKey[64]={0};strcpy( szKey , ACCESS_KEY ); char szNew2[64]={0};long lOut=sizeof(szNew2); TCHAR szNew[64]={0}; CDes des; des.Decrypt( szPasswd , strlen(szPasswd),szNew2,lOut,szKey,8); #ifdef UNICODE _tcscpy(szNew,CA2W(szNew2)); #else strcpy(szNew,szNew2); #endif if ( !m_HDadoConnection.ConnectAccess(szPath,szNew ) ) //连接数据库错误,需要重新创建 { MessageBox( _T("系统文件丢失6,请重新安装!") , _T("致命错误") , MB_ICONWARNING ); return false; } m_HDAdoRS.SetAdoConnection( &m_HDadoConnection ); //设置连接 m_Mas_Init = true; //启用接收短信 ::AfxBeginThread((AFX_THREADPROC)Mas_RecvT,(LPVOID)this,/*THREAD_PRIORITY_LOWEST*/THREAD_PRIORITY_BELOW_NORMAL); return m_Mas_Init; #else return false; #endif } UINT DLG_Send::Mas_SendT(void *pParam) { #ifdef SUPPER_IM_MAS DLG_Send * pDlg = (DLG_Send *)pParam; CString str; try { long lCount = pDlg->m_wndList.GetItemCount(); long lMaxMsgLen = pDlg->m_pMainFrame->m_Setup.Mas_MaxLen; //取允许的最大字符数 BOOL bLongSms = pDlg->m_B_LongSms.GetCheck(); for ( int i=0 ; im_bSend ; i++ ) { Send_User user = pDlg->GetUser(i,true); if ( user.szStatus[0] != '1' && pDlg->Mas_MobileIsSend(user.szMobile) ) //未发送成功的,是重庆地区的号码 { CString strCM; BOOL bCMFirst = pDlg->m_pMainFrame->GetQJCM(strCM); //找到应发送的记录,开始发送 TCHAR szSendMsg2[1024]={0}; CString csTemp(pDlg->m_szMsg); //if ( _tcsncmp(user.szName,_T("IP"),2) ) //名称不是以IP开头,因为IP开头的自动导入的用户姓名 // csTemp.Replace( _T("\"%Name%\"") , user.szName ); //替换姓名 //else // csTemp.Replace( _T("\"%Name%\"") , _T("") ); //替换姓名 csTemp.Replace( _T("\"%Name%\"") , user.szName ); //替换姓名 csTemp.Replace( _T("\"%NickName%\"") , user.szNickName ); //替换昵称 csTemp.Replace( _T("\"%Memo%\"") , user.szBZ ); //替换备注 char szFalsh[8]={0}; szFalsh[0] = 01; //csTemp.Replace( _T("\"%^%\"") , szFalsh ); //替换闪烁符 csTemp.Replace( strCM , _T("") ); //删除短信中原有的强制签名,重新生成过 _tcscpy( szSendMsg2 , (LPCTSTR)csTemp ); //取得当前发送内容 /* if ( !m_bFiltOver && !bFilt( szSendMsg ) ) //过滤信息 { if ( m_bSend ) { OnSendStart(); //停止 } return ; } //看是否为黑名单 if ( isBack(user.szMobile) ) { m_wndList.SetItemText( m_lSendIndex , 3 , _T("提交失败") ); m_dwBackCount++; //黑名单数量 continue; } */ SYSTEMTIME tTimer=pDlg->m_tTimer; //计算生日定时短信 if ( pDlg->m_bSendSR ) { SYSTEMTIME t;::GetSystemTime(&t); tTimer.wYear = t.wYear; tTimer.wMonth = _ttol(user.szBZ); tTimer.wDay = _ttol(user.szBZ+3); //判断生日是否已过,如果已过,下年再提醒 long lNow=t.wMonth*100+t.wDay; long lSR =tTimer.wMonth*100+tTimer.wDay; if ( lSRm_B_FD.GetCheck() ) //选择了强制加入分段标志 { long lFDMsgLen = UCS2Len_2(szSendMsg2); if ( lFDMsgLen>lMaxMsgLen) bYDFD = true; if ( lFDMsgLen>(lMaxMsgLen-12)) bXLTFD = true; } if ( !bYDFD && bLongSms ) //如果选择了长短信,可以发1500个字 { lFDYDLen = 1500; lFDXLTLen= 1500; lMaxMsgLen=1500; } BOOL bGetMsg; while ( true ) { memset( szSendMsg , 0 , sizeof(szSendMsg) ); if (!_tcsncmp(user.szMobile, _T("12"), 2) || !_tcsncmp( user.szMobile , _T("13") , 2 ) || !_tcsncmp( user.szMobile , _T("15") , 2 ) || !_tcsncmp( user.szMobile , _T("14") , 2 ) || !_tcsncmp( user.szMobile , _T("16") , 2 ) || !_tcsncmp( user.szMobile , _T("17") , 2 ) || !_tcsncmp( user.szMobile , _T("18") , 2 ) || !_tcsncmp( user.szMobile , _T("19") , 2 )) { //手机号码可以支持70个汉字 if ( bYDFD ) { bGetMsg = GetSpiltUnicodeMsg( szSendMsg2 , szSendMsg , lMsgIndex , lFDYDLen ,lMsgAll); bFD = true; } else { bGetMsg = GetSpiltUnicodeMsg( szSendMsg2 , szSendMsg , lMsgIndex , lMaxMsgLen ,lMsgAll); } } else { //小灵通手机号码可以支持58个汉字 if ( bXLTFD ) { bGetMsg = GetSpiltUnicodeMsg( szSendMsg2 , szSendMsg , lMsgIndex , lFDXLTLen ,lMsgAll); bFD = true; } else { bGetMsg = GetSpiltUnicodeMsg( szSendMsg2 , szSendMsg , lMsgIndex , lMaxMsgLen-12 ,lMsgAll); } } if ( bGetMsg ) //能取到信息,发送 { CString strSendNowMsg; if ( !pDlg->m_pMainFrame->m_Setup.Mas_CM ) { strCM = _T(""); //已设置无需要引入短信签名 } if ( bFD ) { strSendNowMsg.Format(_T("%d/%d:%s%s") ,lMsgIndex,lMsgAll,szSendMsg,strCM); } else { if ( bCMFirst ) strSendNowMsg.Format(_T("%s%s") , strCM,szSendMsg); else strSendNowMsg.Format(_T("%s%s") , szSendMsg,strCM); } CString strSendTime=_T(""); if ( COleDateTime(tTimer).GetStatus() == COleDateTime::valid ) strSendTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"),tTimer.wYear,tTimer.wMonth,tTimer.wDay,tTimer.wHour,tTimer.wMinute,tTimer.wSecond ); //计算mas发送短信时的SmID pDlg->m_lMasAllSendCount ++; SYSTEMTIME tsm;GetLocalTime(&tsm); long lSmID=(tsm.wDay%10)*10000000+tsm.wHour*100000+tsm.wMinute*1000+pDlg->m_lMasAllSendCount; //日+时+分+序号 long lSrcID=0; CStringA Mobile = CW2A(user.szMobile); CStringA Msg = CW2A(strSendNowMsg); CStringA Time = CW2A(strSendTime); int iRet = (*pDlg->m_Mas_sendSMAdvTime)(Mobile, Msg,Time, lSmID,lSrcID); //int iRet = sendSMAdvTime(user.szMobile, strSendNowMsg,strSendTime, user.lItemID,lSrcID); if ( iRet!=0 ) { pDlg->m_pMainFrame->SaveSetup(); //保存计数 pDlg->OnSendStart(); //先停止发送 str.Format( _T("Mas发送短信出错,错误代码:%d!") , iRet ); pDlg->MessageBox(str , _T("错误") ,MB_ICONWARNING ); pDlg->RefreshStatusAndLog(); return 0; } //保存到日志中 SaveItemStatus * pStatus = new SaveItemStatus; memset(pStatus , 0 , sizeof(SaveItemStatus)); pStatus->lSendID = lSmID; pStatus->lItemID = user.lItemID; pDlg->m_wndList.SetItemText( i , 3 , _T("发送成功") ); _tcscpy(pStatus->szStatus , _T("1") ); pStatus->lStatus = 10; //提交成功 _tcscpy(pStatus->szSendNum,_T("")); _tcscpy(pStatus->szName,user.szName); if ( bLongSms ) //只记录前面70个字 { lMsgIndex=1; GetSpiltUnicodeMsg((TCHAR*)(const TCHAR*)strSendNowMsg , szSendMsg , lMsgIndex , 70 ,lMsgAll); _tcscpy(pStatus->szMsg , _T("长信0000:")); _tcscpy(pStatus->szMsg+_tcslen(_T("长信0000:")),szSendMsg); } else { _tcscpy(pStatus->szMsg,strSendNowMsg); } _tcscpy(pStatus->szMobile,user.szMobile); pDlg->m_SaveItemStatus.AddTail(pStatus); pDlg->m_pMainFrame->m_Setup.Mas_Count++; //记录号加1 if ( pDlg->m_pMainFrame->m_Setup.Mas_Count % 200 ==0 ) //第200条保存一次 { pDlg->m_pMainFrame->SaveSetup(); } pDlg->m_Mas_SendOK ++; //记录号加1 lMsgIndex ++; //分隔加1 } else { if ( lMsgAll<=0 ) //没有短信内容 { pDlg->m_dwNoMsgCount++; //没内容数量 } break; } } Sleep(10); } } pDlg->m_pMainFrame->SaveSetup(); //保存计数 pDlg->m_Mas_MasEnd = true; if ( pDlg->m_Mas_MobsetEnd ) //短信易的已发送完成 { //短信发送完成 pDlg->m_lBoxType = 1 ; //因为发送完成,列表的格式为已发 pDlg->List_Save(true); //保存 if ( pDlg->m_bSend ) { pDlg->OnSendStart(); //停止 } CString strMsg; strMsg.Format( _T("短信发送完成,成功提交%d个号码!用时%d秒。%s") , pDlg->m_lSendOK+pDlg->m_Mas_SendOK,(::GetTickCount()-pDlg->m_dwSendStartTime)/1000,pDlg->GetOtherSendRetMsg() ); pDlg->MessageBox( strMsg , _T("信息") , MB_ICONASTERISK ); pDlg->RefreshStatusAndLog(); } return 0; } catch(...) { return 0; } #endif return 1; } BOOL DLG_Send::Mas_MobileIsSend(CString strMobile) { #ifdef SUPPER_IM_MAS if ( !Mas_Enable() ) return false; // if ( !Mas_Init() ) // return false; if ( m_pMainFrame->m_Setup.Mas_MaxSend>0 && m_pMainFrame->m_Setup.Mas_Count>=m_pMainFrame->m_Setup.Mas_MaxSend) { //超出当月发送量了,暂停mas发送。 return false; } CString str; if ( !m_pMainFrame->m_Setup.Mas_WW ) { str = strMobile.Left(2); if (str == _T("12") || str == _T("13") || str==_T("15") || str==_T("14") ||str==_T("16") ||str==_T("17") || str==_T("18") || str==_T("19") ) { str = strMobile.Left(3); if ( str==_T("130") || str==_T("131") || str==_T("132") || str==_T("133")|| str==_T("153") || str==_T("155") || str==_T("156") || str==_T("189") || str==_T("186") || str==_T("180") ) { return false; } } else { return false; } } if ( m_pMainFrame->m_Setup.Mas_Prov==1 ) //仅发送广东地区的号码 { if ( strMobile.Left(1)==CString(_T("0")) ) { for ( int i=3 ; i<5 ; i++ ) { str.Format(_T("select * from HDB_XLT where Code='%s' and Prov='广东' ") , strMobile.Left(i)); if ( m_HDAdoRS.Open(str) && !m_HDAdoRS.IsEOF() ) { return true; } } } else { str.Format( _T("select * from HDB where Head='%s' and Province='广东'") , strMobile.Left(7) ); if ( m_HDAdoRS.Open(str) && !m_HDAdoRS.IsEOF() ) { return true; } } return false; } else { return true; //mas发送全国移动号码 } #else return false; #endif return false; } UINT DLG_Send::Mas_RecvT(void *pParam) { #ifdef SUPPER_IM_MAS DLG_Send * pDlg = (DLG_Send *)pParam; CString str; try { while ( pDlg->m_Mas_Init ) { if ( !pDlg->m_bSend ) //在发送过程中不收短信 { //接收短信 MOItem moBody[1]; memset(&moBody, 0, sizeof(moBody)); //nCount = receiveSMAdv(moBody, -1, -1); int nCount = (* pDlg->m_Mas_receiveSM)(moBody, 1); if ( nCount > 0) { ANS_RecvData2 sms={0}; _tcscpy( sms.szSendNum , CA2W(moBody[0].mobile) ); _tcscpy( sms.szRecvNum , _T("Mas") ); _tcscpy( sms.szMsg , CA2W(moBody[0].smContent) ); ::GetLocalTime(&sms.tRecv); ExMobileGZM(sms.szSendNum); pDlg->m_pMainFrame->m_pBaseView->m_dlgSmsJS.RecvNewSms(sms,false); //收到新的信息; Sleep(500); } //接收状态报告 RptItem rptBody[5]; memset(&rptBody, 0, sizeof(rptBody)); //nCount = receiveRPTAdv(rptBody, -1, -1); nCount = (* pDlg->m_Mas_receiveRPT)(rptBody, 5); if ( nCount > 0) { for ( int j=0 ; j3 ) { strRecvTime.Format( _T("#%s#") , CA2W(rptBody[j].rptTime) ); } //if ( CString(rptBody[j].rptDesc) == CString( _T("发送成功。") ) ) if ( rptBody[j].rptId ==0 ) { str.Format( _T("Update SmsLog Set Status=12, RecvTime=%s where SendID=%d") , strRecvTime , rptBody[j].smId ); } else { str.Format( _T("Update SmsLog Set Status=13, RecvTime=%s where SendID=%d") , strRecvTime , rptBody[j].smId ); } pDlg->m_AdoRS5.Open(str); Sleep(500); } int i=0; } } Sleep(2000); //1秒钟才收一次短信 } } catch(...) { } #endif return 1; } BOOL DLG_Send::IsLocakBack(CString strMobile) { CString str; str.Format( _T("select * from back where Mobile='%s' and Status=1") , strMobile ); if ( m_AdoRS6.Open(str) && !m_AdoRS6.IsEOF() ) return true; else return false; } BOOL DLG_Send::Mas_OK() { #ifdef SUPPER_IM_MAS if ( !this->m_pMainFrame->m_Setup.Mas_Enable ) return false; if ( !m_Mas_Init ) return false; return true; #else return false; #endif } void DLG_Send::On_User_Inport_MasSDK_DGWL_FP() { } void DLG_Send::On_User_Inport_MasSDK_DGWL_SP() { } void DLG_Send::On_User_Inport_MasSDK_DGWL_KF() { } void DLG_Send::On_User_Inport_MasSDK_DGWL_ZC() { } void DLG_Send::SEND_USER_INPORT_MasSDK_DGWL(long lType) { } void DLG_Send::OnSendTask() { if ( m_B_Task.GetCheck() ) { long lCount=m_wndList.GetItemCount(); if ( lCount>=100 ) { MessageBox(_T("号码数超100,不能启用任务方式,请删除部分号码后重试!") , _T("错误") , MB_ICONWARNING ); m_B_Task.SetCheck(false); return ; } /* int iRet = MessageBox(_T("将要设置以任务方式发送短信,任务方式有以下特点:\r\n1、任务方式为批量上传到服务后由服务器进行发送。\r\n2、任务方式支持按号码文件发送,每组任务不超过100组号码。\r\n3、任务方式本地没有详细发送日志。\r\n4、任务为临时性质,定时时间不可过长。\r\n是否继续以任务方式发送?"),_T("提问") , MB_ICONQUESTION|MB_YESNO); if ( iRet!= IDYES ) { m_B_Task.SetCheck(false); } */ } else { #ifdef SUPPER_IM_MAS m_B_SaveSendLog.SetCheck(true);//选中记录日志 m_B_ReMobile.SetCheck(true);//选中查重 #endif } OnSendTask2(); } void DLG_Send::OnSendTask2() { if ( m_B_Task.GetCheck() ) { m_B_SaveSendLog.EnableWindow(false); m_B_SaveSendLog.SetCheck(false); m_B_FD.EnableWindow(false); m_B_FD.SetCheck(false); m_L_lInterval.EnableWindow(false); m_L_lInterval.SetCurSel(0); m_B_Name.EnableWindow(false); m_B_NickName.EnableWindow(false); //m_B_Memo.EnableWindow(false); } else { m_B_SaveSendLog.EnableWindow(true); if (m_pMainFrame->m_Ans_Login2.lLongSmsType != 1) m_B_FD.EnableWindow(true); m_L_lInterval.EnableWindow(true); m_B_Name.EnableWindow(true); m_B_NickName.EnableWindow(true); //m_B_Memo.EnableWindow(true); } } void DLG_Send::OnOK() { return ; CDialog::OnOK(); } void DLG_Send::OnCancel() { CDialog::OnCancel(); } void DLG_Send::OnClickedSendRemobile() { if (m_B_ReMobile.GetCheck()) { m_bShowReMobile = true; m_lReMobileType = 0; } }