検索

两个wince小程序,Gprs功分器测试,和开关机拨号测试,都已经顺利完工,现在有空回头学一下之前一知半解的细节问题。 1. 在cedit中打印log -- //在edittext中打印信息voidCSimTestDlg::ShowMessage(CStringstrMsg){ CEdit*pMsgInfo = (CEdit*)GetDlgItem(IDC


两个wince小程序,Gprs功分器测试,和开关机拨号测试,都已经顺利完工,现在有空回头学一下之前一知半解的细节问题。

1. 在cedit中打印log

-- 

//在edittext中打印信息
voidCSimTestDlg::ShowMessage(CStringstrMsg)
{
      CEdit*pMsgInfo = (CEdit*)GetDlgItem(IDC_EDIT_TIPS);
      pMsgInfo->SetSel(pMsgInfo->GetWindowTextLength(),pMsgInfo->GetWindowTextLength());     //光标移动到当前所显示文本的末尾
      pMsgInfo->ReplaceSel(strMsg);   //在光标末尾插入字符串
          pMsgInfo->ReplaceSel(_T("\r\n"));
}


2.写log文件

--

//自己写的,解决了中文乱码和末尾有小方框的问题,可能还有隐患没发现
//写log记录到\ResidentFlash\开关机测试log.txt
int CSimTestDlg::writelog(CString logStr){
 
      CFilemyFile;
      char*pData = new char[500];
      TCHAR*pStrLog = new TCHAR[500];
 
      CStringstr_time = _T("");
      CStringstr_result = _T("");
      CStringstrFile = _T("");
 
       SYSTEMTIMEsys;     
      GetLocalTime(&sys );
 
     
      str_time.Format(_T("%4d/%02d/%02d%02d:%02d:%02d"),sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond);          
      str_result= str_time + logStr;
     
      intfileLength = str_result.GetLength();                 
      wcscpy(pStrLog,(LPCTSTR)str_result);
      intcpylen =MyWideCharToMultiByte_test(pStrLog,pData,fileLength*2);//获得unicode转Ansi之后的长度,说明http://blog.csdn.net/sky1415/article/details/4137872
 
       strFile= _T("\\ResidentFlash\\开关机测试log.txt");
      myFile.Open(strFile,CFile::modeCreate | CFile::modeWrite |CFile::typeBinary|CFile::modeNoTruncate);//modeNoTruncate表示为续写方式
     
      myFile.SeekToEnd();
      myFile.Write(pData,cpylen);
      myFile.Flush();
      myFile.Close();
 
      delete[]pData;     
      delete[]pStrLog;
      return0;
}
intCGPRS_SIGNAL_TESTDlg::MyWideCharToMultiByte_test(WCHAR*wchars, CHAR* schars,int scharsLen)
{
      memset(schars,0, scharsLen);
      CStringm_snd = wchars;
      intlen = m_snd.GetLength();
      CStringtmpstr(m_snd); //复制要发送的字符串
      intmultibytelen = WideCharToMultiByte(//计算从Unicode转换到Ansi后需要的字节数
              CP_ACP,//根据ANSI codepage转换
              WC_COMPOSITECHECK|WC_DEFAULTCHAR, //转换出错用缺省字符代替
              (LPCWSTR)tmpstr.GetBuffer(len),//要转换的字符串地址
              len,//要转换的个数
              0,//转换后字符串放置的地址
              0,//最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节
              0,//缺省的字符:"\0"
             0//缺省的设置
      );
      WideCharToMultiByte(//转换Unicode到Ansi
              CP_ACP,WC_COMPOSITECHECK |WC_DEFAULTCHAR, (LPCWSTR)tmpstr.GetBuffer(len), len,(char*)schars, //转换到缓冲区中
              scharsLen,//最多个字节
              0,0);
      returnmultibytelen;
}
 

 

3. 调用系统程序并打开窗口

-- CreateProcess:http://baike.baidu.com/link?url=aLC_mEQNRDbEOf_wfXOxeH1Q2Q-XpIr9mXQDZKnHLXmPq-1niVJhYH05eTtCEnnE

#define   FILE_PLAY_EXEC     _T("\\ResidentFlash\\player\\PLAYER.EXE")
#define   FILE_PLAY_DATA      _T("\\ResidentFlash\\PandaNormal.avi")
      PROCESS_INFORMATIONinfo;
      CreateProcess(FILE_PLAY_EXEC,FILE_PLAY_DATA, NULL, NULL, FALSE,CREATE_NEW_CONSOLE, NULL, NULL, NULL,&info);
 

4. 定时器设置

--

//.cpp注册定时器
BEGIN_MESSAGE_MAP(CGPRS_SIGNAL_TESTDlg,CDialog)
       //{{AFX_MSG_MAP(CGPRS_SIGNAL_TESTDlg)
      ON_BN_CLICKED(IDC_BUTTON_START,OnButtonStart)
      ON_BN_CLICKED(IDC_BUTTON_STOP,OnButtonStop)
      ON_WM_TIMER()//定时器设置
      ON_MESSAGE(WM_GPRSRECV,OnGPRSRecv)//接收消息
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()
 
//.cpp实现OnTimer,对话框定时消失
voidCGPRS_SIGNAL_TESTDlg::OnTimer(UINT_PTRnIDEvent)
{
      //TODO: Add your control notification handler code here
 
      HWNDhWnd = ::FindWindow(NULL, _T("提示"));   //查找标题为B的窗口,返回窗口句柄
 
      if(hWnd)   //如果窗口句柄存在
       {
              ::SendMessage(hWnd,WM_CLOSE,NULL, NULL);//可行
              //DestroyWindow();   //关闭整个窗口,不行
              //keybd_event(13,0,0,0);//模拟回车键按下,有啪的一声
             //keybd_event(VK_RETURN,0,0,0); //模拟回车键按下,有啪的一声
      }
      KillTimer(nIDEvent);   //关闭定时器
      CDialog::OnTimer(nIDEvent);
}
//.h文件中声明
        afx_msg void OnTimer(UINT_PTRnIDEvent);//接收消息

5.设置控件背景色

--

//.h文件中,注册函数
afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd*pWnd, UINT nCtlColor);
 
//cpp中重载消息响应函数
BEGIN_MESSAGE_MAP(CLytNandTestDlg, CDialog)
//{{AFX_MSG_MAP(CLytNandTestDlg)
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
 
 
//cpp文件中实现方法,根据id设置不同颜色
/************************************************************************/
/*               UI显示                                                 */
/************************************************************************/
HBRUSH CLytNandTestDlg::OnCtlColor(CDC*pDC,CWnd* pWnd, UINT nCtlColor)
{
      HBRUSHhbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
     
      //Are we painting theIDC_MYSTATIC control? We can use
      //CWnd::GetDlgCtrlID() to perform the most efficient test.
      if(pWnd->GetDlgCtrlID() == IDC_SHOW)
      {
            
             RETAILMSG(1,(_T("OnCtlColor\n")));
              //Set the text color to red.
              pDC->SetTextColor(RGB(255,255,255));
            
              m_brush=   ::CreateSolidBrush( RGB(0,0,255));
            
              //Set the background mode fortext to transparent
              //so background will show thru.
              pDC->SetBkMode(TRANSPARENT);
            
              //Return handle to our CBrushobject.
              hbr= m_brush;
      }
     
     
      returnhbr;
}


6.注册表读写

-- 调用示例

//修改注册表,自动开机
reg->WriteRegMultiString(HKEY_LOCAL_MACHINE,_T("init\\"),L"Launch80",_T("\\ResidentFlash\\OurAPP\\开关机测试v1.3.exe"));         
reg->DeleteRegValue(HKEY_LOCAL_MACHINE,_T("init\\"),L"Launch80");

源码

/***************************************************************************
$Id$
Copyright (C) Centerm Information Co.,Ltd.All rights reserved.
 
Model Name:
Reg.cpp
 
Description:
注册表测试
 
Environment:
WinCE5.0、6.0
 
History:
<author>      <time>     <version>      <desc>
Wangxuehong 2009-2-10      2.00         创建
***************************************************************************/
 
#include "StdAfx.h"
#include "Reg.h"
 
// 向注册表写入字符串
void CReg::WriteRegString(HKEY hKey,TCHAR*Key, TCHAR *Name, TCHAR *Value, DWORD size)
{
      HKEYhk;
      LONGreCode;
      DWORDdwDisposition;
 
      reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hk,&dwDisposition);
      if(reCode== ERROR_SUCCESS)
      {
              RegSetValueEx( hk,Name,0, REG_SZ,(LPBYTE)Value, (size + 1)*2 );
              RegCloseKey(hk);
      }
}
 
// 向注册表写入字符串
void CReg::WriteRegStr(HKEY hKey,TCHAR*Key, TCHAR *Name, TCHAR *Value)
{
      HKEYhk;
      LONGreCode;
      DWORDdwDisposition;
 
      reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hk,&dwDisposition);
      if(reCode== ERROR_SUCCESS)
      {
              RegSetValueEx(hk,Name,0, REG_SZ,(LPBYTE)Value, (lstrlen(Value)+1)*sizeof(TCHAR));
             RegCloseKey(hk);
      }
}
 
// 向注册表写入多字符串
void CReg::WriteRegMultiString(HKEYhKey,TCHAR *Key, TCHAR *Name, TCHAR *Value)
{
      HKEY    hk;
      LONG     reCode;
      DWORD dwDisposition;
      TCHAR   *pStr;
      WORD    Strl;
 
      pStr =     Value;     Strl    =     0;
      while(*pStr)
      {
              while(*pStr)
              {
                     pStr++;
                     Strl++;
              }
              pStr++;
              Strl++;
      }
      reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hk,&dwDisposition);
      if(reCode== ERROR_SUCCESS)
      {
              RegSetValueEx(hk,Name,0,REG_MULTI_SZ, (LPBYTE)Value, (Strl+1)*2);
              RegCloseKey(hk);
      }
}
 
// 向注册表写入二进制
void CReg::WriteRegBin(HKEY hKey,TCHAR*Key, TCHAR *Name, VOID *Value, DWORD size)
{
      HKEYhk;
      LONGreCode;
      DWORDdwDisposition;
 
      reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hk,&dwDisposition);
 
      if(reCode==ERROR_SUCCESS)
      {
              RegSetValueEx(hk,Name,0,REG_BINARY, (LPBYTE)Value, size*2);
              RegCloseKey(hk);
      }
}
 
// 向注册表写入INT
void CReg::WriteRegInt(HKEY hKey, TCHAR*Key,TCHAR *Name, DWORD Value)
{
      LONGreCode;
      HKEYhk;
      DWORDdwDisposition;
 
      reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
              NULL,&hk,&dwDisposition);
 
      if(reCode== ERROR_SUCCESS)
      {
             RegSetValueEx(hk,Name,0,REG_DWORD, (LPBYTE)&Value, 4);
              RegCloseKey(hk);
      }
}
 
// 向注册表写入DWORD
BOOL CReg::ReadRegDWord(HKEY hKey,TCHAR*Key, TCHAR *Name,DWORD *dwValue)
{
      HKEY    hk;
      DWORD data = 0;
      DWORD DataSize = sizeof(DWORD);
      DWORD dwType  = 0;
      LONG     reCode;
 
      reCode=RegOpenKeyEx(hKey,Key, 0, KEY_READ, &hk);
 
      if(reCode==  ERROR_SUCCESS) {
              reCode= RegQueryValueEx(hk, Name,NULL, &dwType, (BYTE*)&data,&DataSize);            
              RegCloseKey(hk);
              if(reCode==ERROR_SUCCESS)  *dwValue = data;
              elsereturn FALSE;
      }
      else  return FALSE;
 
      returnTRUE;
}
 
// 从注册表读取一个INT
DWORD CReg::ReadRegInt(HKEY hKey,TCHAR*Key, TCHAR *Name)
{
      HKEY    hk;
      DWORD data = 0;
      DWORD DataSize = sizeof(DWORD);
      DWORD dwType  = 0;
      LONG     reCode;
 
      reCode= RegOpenKeyEx(hKey, Key, 0, KEY_READ, &hk);
 
       if(reCode== ERROR_SUCCESS)
      {
              reCode= RegQueryValueEx(hk, Name,NULL, &dwType, (BYTE*)&data,&DataSize);
              RegCloseKey(hk);
      }
      else
              data= 0;  
      returndata;
}
 
// 从注册表读取字符串
DWORD CReg::ReadRegString(HKEY hKey,TCHAR*Key, TCHAR *Name, TCHAR* data)
{
      HKEYhk;
      LONGreCode;
      DWORDDataSize = 1024;
      DWORDdwType;
 
      reCode= RegOpenKeyEx(hKey,Key,0,KEY_READ,&hk);
 
      if(reCode== ERROR_SUCCESS)
       {
              reCode=RegQueryValueEx(hk,Name,NULL,&dwType,(BYTE*)data,&DataSize);
              if(dwType != REG_SZ &&dwType != REG_MULTI_SZ )
              {
                     DataSize= 0;
                     data[0]= 0;
              }
             RegCloseKey(hk );
              returnDataSize;
      }
      else
      {
              data[0]= 0;
              return0;
      }
}
 
// 从注册表读取二进制
DWORD CReg::ReadRegBin(HKEY hKey,TCHAR*Key, TCHAR *Name, TCHAR* data)
{
      HKEYhk;
      LONGreCode;
      DWORDDataSize = 1024;
      DWORDdwType;
 
      reCode= RegOpenKeyEx(hKey,Key,0,KEY_READ,&hk);
 
      if(reCode == ERROR_SUCCESS )
      {
              reCode=RegQueryValueEx(hk,Name,NULL,&dwType,(BYTE*)data,&DataSize);
             RegCloseKey(hk);
              returnDataSize;
      }
      else
      {
              data[0]= 0;
              return0;
      }
}
 
// 删除注册表内容
void CReg::DeleteRegValue(HKEYhKey,TCHAR*Key,TCHAR *Name)
{
      HKEYhk;
      LONGreCode;
 
       reCode= RegOpenKeyEx( hKey, Key, 0,KEY_ALL_ACCESS, &hk );
 
      if(reCode== ERROR_SUCCESS)
      {
              reCode= RegDeleteValue(hk,Name);
              RegCloseKey(hk);
      }
}
 
// 复制注册表内容
BOOL CReg::CopyReg(HKEY hSKey, TCHAR*SKey,TCHAR *SName,HKEY hDKey, TCHAR *DKey, TCHAR *DName)
{
      BOOLret = FALSE;
      HKEYshk, dhk;
      BYTEdata[1024];
      DWORDDataSize = 1024;
      DWORDdwType, dwDisposition;
 
      if(RegOpenKeyEx(hSKey, SKey, 0, KEY_READ, &shk) == ERROR_SUCCESS)
      {
             if(RegCreateKeyEx(hDKey,DKey,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
                    NULL,&dhk,&dwDisposition)== ERROR_SUCCESS)
              {
                    if(RegQueryValueEx(shk,SName,NULL,&dwType,data,&DataSize)==ERROR_SUCCESS)
                     {
                           if(RegSetValueEx(dhk,DName,0,dwType,data,DataSize) == ERROR_SUCCESS)
                            {
                                   ret=TRUE;                             
                            }
                     }   
                     RegCloseKey(dhk);
              }
              RegCloseKey(shk);
      }
      returnret;
}
 
 
//设置NumLock状态
void CReg::SetNumLockStatus(BOOL NumLockOn)
{
      SHORTKeyStatus;                            
      KeyStatus= GetKeyState(VK_NUMLOCK);
      if(KeyStatus&& 0x01)//检查状态为开
      {
              if(!NumLockOn)
              {
                    keybd_event(VK_NUMLOCK,(BYTE)0xe045,0,0);
                     keybd_event(VK_NUMLOCK,(BYTE)0xe045,KEYEVENTF_KEYUP,0);
              }
      }
      else//检查状态为关
      {
              if(NumLockOn)
              {
                    keybd_event(VK_NUMLOCK,(BYTE)0xe045,0,0);
                     keybd_event(VK_NUMLOCK,(BYTE)0xe045,KEYEVENTF_KEYUP,0);
              }
      }                                             
}
 
//设置NumLock状态
void CReg::SetNumLockStatusFromReg()
{
      BOOLnumlockStatus =ReadRegInt(HKEY_LOCAL_MACHINE,TEXT("SoftWare\\Start"),TEXT("NumLockOn"));
      SetNumLockStatus(numlockStatus );
}
 
/*
*************************************************
*Desc: 保存注册表
*Para:
*Return:
*Update Record:
*************************************************
*/
typedef DWORD (*pSaveRegData)(HWND hwnd);
BOOL CReg::SaveReg()
{
#ifndef HIVE_BASED
      HINSTANCE  hstbRegLib=NULL;
      pSaveRegDatadllSaveRegData;
 
      hstbRegLib= LoadLibrary(TEXT("SSReg.dll"));
 
      if( hstbRegLib == NULL )
      {
              returnFALSE;
      }
 
      dllSaveRegData= (pSaveRegData) GetProcAddress( hstbRegLib,TEXT("SaveRegData") );
      if( dllSaveRegData == NULL )
      {
              returnFALSE;
      }
      else
      {
              dllSaveRegData(NULL );
      }
 
      FreeLibrary(hstbRegLib );
#else
      DWORDdwRet = 0;
      if(ERROR_SUCCESS == RegFlushKey( HKEY_CURRENT_USER ) )
      {
             //RETAILMSG(DEBUG_BY_AHZIT,(L"RegFlushKey [HKEY_CURRENT_USER]successed.\r\n"));
      }
      else
      {
              //RETAILMSG(DEBUG_BY_AHZIT,(L"RegFlushKey[HKEY_CURRENT_USER] failed.\r\n"));     
              returnfalse;
      }
      dwRet= RegFlushKey( HKEY_LOCAL_MACHINE );
      if(ERROR_SUCCESS != dwRet )
      {
              //RETAILMSG(DEBUG_BY_AHZIT,(L"RegFlushKey[HKEY_LOCAL_MACHINE] failed, errorcode:[%ld].\r\n", dwRet));
              returnfalse;
      }
      else
      {
             //RETAILMSG(DEBUG_BY_AHZIT,(L"RegFlushKey [HKEY_LOCAL_MACHINE]successed.\r\n"));    
      }
#endif
      returnTRUE;
}
</desc></version></time></author>

/***************************************************************************
$Id$
Copyright (C) Centerm Information Co.,Ltd.All rights reserved.
 
Model Name:
Reg.h
 
Description:
注册表测试
 
Environment:
WinCE5.0、6.0
 
History:
<author>      <time>     <version>      <desc>
Wangxuehong 2009-2-10      2.00         创建
***************************************************************************/
 
#pragma once
 
class CReg
{
public:
      voidWriteRegString(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR *Value,DWORD size);
      voidWriteRegStr(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR *Value);
      voidWriteRegMultiString(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR*Value);
      voidWriteRegBin(HKEY hKey, TCHAR *Key, TCHAR *Name, VOID *Value, DWORDsize);
      voidWriteRegInt(HKEY hKey, TCHAR *Key, TCHAR *Name, DWORD Value);
      BOOLReadRegDWord(HKEY hKey, TCHAR *Key, TCHAR *Name,DWORD *dwValue);
      DWORDReadRegInt(HKEY hKey, TCHAR *Key, TCHAR *Name);
      DWORDReadRegString(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR* data);
      DWORDReadRegBin(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR* data);
      voidDeleteRegValue(HKEY hKey,TCHAR *Key,TCHAR *Name);
      BOOLCopyReg(HKEY hSKey, TCHAR *SKey, TCHAR *SName,HKEY hDKey, TCHAR*DKey, TCHAR*DName);
 
      voidSetNumLockStatus(BOOL NumLockOn);
      voidSetNumLockStatusFromReg();
      BOOLSaveReg();
};
</desc></version></time></author>


 

7. 将系统时间转化为CString, 查询文件是否存在,得到当前绝对路径

--

//系统时间转化为字符串
CString Systime2CString(SYSTEMTIME m_time){
 
   TCHARszDateTime[100] = {0};
 
  _stprintf(szDateTime, _T("%04d/%02d/%02d%02d:%02d:%02d"),m_time.wYear,m_time.wMonth,
              m_time.wDay,m_time.wHour,m_time.wMinute, m_time.wSecond);
  CString str = szDateTime;
      returnstr;
}
//文件是否存在
BOOL IsFileExist(LPTSTR lpFilePath) 
{  
      WIN32_FIND_DATAm_fd;
      if(FindFirstFile(lpFilePath ,&m_fd) ==INVALID_HANDLE_VALUE )
              returnFALSE;
      returnTRUE;
}
 
 
/*
//获得当前绝对路径
void GetCurPath(WCHAR* strFilePath)
{
    
   int i = 0;
   int sLen = 0;
   sLen = GetModuleFileName(NULL,strFilePath,260);
   for(i=sLen;i!=0;i--)
    {
      if(strFilePath[i]==WCHAR('\\'))
       {
          break;
       }
       strFilePath[i]= WCHAR('\0');
    }
}


8.关机

--

//关机挂起
void CSimTestDlg::halt(){
      inttestCnt  =mprofile->GetPrivateProfileInt(div,ID_testcnt, 0, iniFilePath);
      mprofile->WritePrivateProfileInt(div,ID_testcnt, testCnt+1,iniFilePath);
      Sleep(300);
      SetSystemPowerState(NULL,POWER_STATE_OFF, POWER_FORCE);
}

9.ras拨号

//获取ppp网络状态
BOOL CSimTestDlg::IsConnect()
{
  if(NULL != hRasConn)
   {
      RASCONNSTATUS rasConStatus;
      rasConStatus.dwSize = sizeof(RASCONNSTATUS);
      RasGetConnectStatus(hRasConn,&rasConStatus);
            
      if(RASCS_Connected == rasConStatus.rasconnstate)
      {
          return TRUE;
      }
   }
  return FALSE;
}
 
 
//移除已经拨上去的ras
void CSimTestDlg::RemoveConnect(){
     
      RASCONNentries[25];
      DWORDbufsize=0;
      DWORDnumEntries=0;
      bufsize=25*sizeof(RASCONN);
      entries[0].dwSize=sizeof(RASCONN);
      RASCONNSTATUSstatus;
      status.dwSize=sizeof(RASCONNSTATUS);
      if(RasEnumConnections(entries,&bufsize,&numEntries)==0)
       {
              for(DWORDi=0;i<numentries if while retailmsg for ras disconnect break dword winapi pppdtread pdata csimtestdlg dworddwlast dworddwcurrent dwinterval="5000;" intwaitcount="0;" cstringlog='_T("");' cstringlog_whyfail='_T("");' intdialfailreason="0;" pdlg->reDialCnt= 0;
      DWORDstate_wait_for_event;     //是否已经拨号失败即“断开连接”
      inttestCnt =mprofile->GetPrivateProfileInt(div, ID_testcnt, 0, iniFilePath);
 
      while(shouldEndTest==FALSE&& pDlg->reDialCnt m_test_state=STATE_TESTING_DAIL;//正在拨号的提示
 
              //获得当前系统时间
              dwLast= GetTickCount();
              pDlg->RemoveConnect();          
     
             while(pDlg->IsConnect()&&shouldEndTest==FALSE)
              {
                    if(pDlg->hRasConn!=NULL)
                     {
                           RETAILMSG(1,(_T("退出1\r\n")));
                           RasHangUp(pDlg->hRasConn);         
                     }          
                    Sleep(100);//100MS
                    dwCurrent=::GetTickCount();
                    if(dwCurrent-dwLast>=dwInterval)
                     { 
                           pDlg->SetDlgItemText(IDC_STATUS,_T("5s还没退出重启模块.....等待7S"));//ui
                           pDlg->m_gpio=CreateFile(_T("GPI1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
 
                            if(pDlg->m_gpio!= INVALID_HANDLE_VALUE ) {
 
                                  DeviceIoControl(pDlg->m_gpio,IOCTL_CDMA_OFF,NULL,NULL,NULL,NULL,NULL,NULL);
                                  if(myDelay(2000)==FALSE)
                                   {
                                         DialFailReason= -1;
                                          gotoDialFail;
                                   }
                                  DeviceIoControl(pDlg->m_gpio,IOCTL_CDMA_ON,NULL,NULL,NULL,NULL,NULL,NULL);
                                  if(myDelay(7000)==FALSE)
                                   {
                                         DialFailReason= -1;
                                         gotoDialFail;
                                   }
                                  CloseHandle(pDlg->m_gpio);
                                   pDlg->m_gpio=INVALID_HANDLE_VALUE;
                                  pDlg->SetDlgItemText(IDC_STATUS,_T("重启成功....."));//ui
                            }
                   
                     }
 
              }
 
              if(shouldEndTest==TRUE)
              {
                     gotoDialSuccOrAllFailExit;
              }
 
 
              //开始拨号   
              DWORDret;
              waitcount=0;
              RASDIALPARAMSrasDialParams;
              memset(&rasDialParams, 0,sizeof( RASDIALPARAMS ) );
              rasDialParams.dwSize=sizeof(RASDIALPARAMS);
             _tcscpy(rasDialParams.szEntryName,_T("我的连接"));
             ret=RasDial(NULL,NULL,&rasDialParams,0xFFFFFFFF,pDlg->GetSafeHwnd(),&pDlg->hRasConn);
 
              if(ret!=0)
              {
                    pDlg->SetDlgItemText(IDC_STATUS,_T("本次拨号建立失败"));
                    pDlg->m_test_state=STATE_DAIL_FAIL;
                     DialFailReason= -2;
                     gotoDialFail;
              }   
 
      //等待ppp连接
              while(waitcountIsConnect())
                     {   
                            //只要连接成功则认为PPP正常      
                            pDlg->m_test_state=STATE_DAIL_SUCC;
                           gotoDialSuccOrAllFailExit;
                     }else{
                            //如果已经监测到ras处在断开状态,直接退出等待
                           state_wait_for_event= WaitForSingleObject(pDlg->hEvent_exitWaitPPP,1000);
                           if(state_wait_for_event==WAIT_OBJECT_0){
                                  DialFailReason= -5;
                                  gotoDialFail;                           
                            }
                     }
 
              }
 
              if(waitcount>=60){
                    pDlg->SetDlgItemText(IDC_STATUS,_T("等待ppp连接超时"));
                     DialFailReason= -3;
              }elseif(shouldEndTest==TRUE){
                     pDlg->SetDlgItemText(IDC_STATUS,_T("用户取消本次测试"));
                     DialFailReason= -4;
              }   
              gotoDialFail;
 
 
      //拨号失败,重试
      DialFail:
             pDlg->m_test_state=STATE_DAIL_FAIL;
              {
                     inttestCnt1  =mprofile->GetPrivateProfileInt(div,ID_dialFailCnt, 0, iniFilePath);
                    mprofile->WritePrivateProfileInt(div,ID_dialFailCnt, testCnt1+1,iniFilePath);
                   
                     switch(DialFailReason){
                     case-1:
                            log_whyfail=_T("软件退出\r\n");
                            break;
                     case-2:
                            log_whyfail=_T("RasDial失败\r\n");
                            break;
                     case-3:
                            log_whyfail=_T("等待ppp连接超时\r\n");
                            break;
                     case-4:
                            log_whyfail=_T("用户取消本次测试\r\n");
                     case-5:
                            log_whyfail= _T("连接已断开\r\n");
                            break;
                     }
                     if(pDlg->reDialCnt==0){
                           log.Format(_T("第[ %d ]次开机,拨号失败原因:")+log_whyfail,(testCnt));
                     }else{
                           log.Format(_T("重拨( %d ),拨号失败原因:")+log_whyfail,pDlg->reDialCnt);
                     }                 
                     pDlg->writelog(log);
                     pDlg->reDialCnt++;
              }
 
 
      }//while
 
//拨号成功,或者重试次数用完
DialSuccOrAllFailExit:
 
             pDlg->m_bt_start.EnableWindow(FALSE);
//           pDlg->m_bt_stop.EnableWindow(TRUE);
             pDlg->m_bt_exit.EnableWindow(FALSE);
            
              //拨号成功退出
              if(pDlg->m_test_state==STATE_DAIL_SUCC){
                     if(pDlg->reDialCnt==0){
                           log.Format(_T("第[ %d ]次开机,拨号成功\r\n"),testCnt);
                     }else{
                           log.Format(_T("第[ %d ]次开机,重拨次数[ %d]\r\n"), testCnt,pDlg->reDialCnt);
                     }
                     pDlg->writelog(log);
                     return0;
              }
              //用完重试次数退出
             elseif(pDlg->reDialCnt>=10){
                     log.Format(_T("第[ %d ]次开机,重拨次数[ %d ]\r\n"),testCnt,pDlg->reDialCnt);
                     pDlg->stopTest();
                     return-1;
              }
              //用户退出
              elseif(shouldEndTest==TRUE){
                     log=_T("用户主动退出测试!");
                     return-2;
              }                 
              //其他情况
              else
                     return-3;
}
 
LRESULTCSimTestDlg::OnRasDialEvent(WPARAMwp, LPARAM lp)
{
      RASCONNSTATErasState=(RASCONNSTATE)wp;
      switch(rasState)
       {
      caseRASCS_OpenPort:
             SetDlgItemText(IDC_STATUS,_T("打开端口......"));
              break;
      caseRASCS_PortOpened:
             SetDlgItemText(IDC_STATUS,_T("端口已打开."));
              break;
      caseRASCS_ConnectDevice:
             SetDlgItemText(IDC_STATUS,_T("连接设备......"));
              break;
      caseRASCS_DeviceConnected:
             SetDlgItemText(IDC_STATUS,_T("设备已连接."));
              break;
      caseRASCS_Authenticate:
              SetDlgItemText(IDC_STATUS,_T("验证用户及密码......"));
              break;
      caseRASCS_Authenticated:
             SetDlgItemText(IDC_STATUS,_T("通过."));
              break;
      caseRASCS_Connected:
             SetDlgItemText(IDC_STATUS,_T("已连接."));
 
              break;
      caseRASCS_Disconnected:
             SetDlgItemText(IDC_STATUS,_T("连接已断开."));
 
              //??
              //SetEvent(hEvent_exitWaitPPP);
              //hRasConn=NULL;
             //m_bt_exit.EnableWindow(TRUE);   
 
              break;
       default:
              returnTRUE;
      }
      returnTRUE;
}
</numentries>




声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQLのデータベースアップグレードをどのように処理しますか?MySQLのデータベースアップグレードをどのように処理しますか?Apr 30, 2025 am 12:28 AM

MySQLデータベースをアップグレードする手順には次のものがあります。1。データベースをバックアップします。2。現在のMySQLサービスを停止します。3。MySQLの新しいバージョンをインストールします。アップグレードプロセス中に互換性の問題が必要であり、Perconatoolkitなどの高度なツールをテストと最適化に使用できます。

MySQLに使用できるさまざまなバックアップ戦略は何ですか?MySQLに使用できるさまざまなバックアップ戦略は何ですか?Apr 30, 2025 am 12:28 AM

MySQLバックアップポリシーには、論理バックアップ、物理バックアップ、増分バックアップ、レプリケーションベースのバックアップ、クラウドバックアップが含まれます。 1. Logical BackupはMySqldumpを使用してデータベースの構造とデータをエクスポートします。これは、小さなデータベースとバージョンの移行に適しています。 2.物理バックアップは、データファイルをコピーすることで高速かつ包括的ですが、データベースの一貫性が必要です。 3.インクリメンタルバックアップは、バイナリロギングを使用して変更を記録します。これは、大規模なデータベースに適しています。 4.レプリケーションベースのバックアップは、サーバーからバックアップすることにより、生産システムへの影響を減らします。 5. Amazonrdsなどのクラウドバックアップは自動化ソリューションを提供しますが、コストと制御を考慮する必要があります。ポリシーを選択するときは、データベースサイズ、ダウンタイム許容度、回復時間、および回復ポイントの目標を考慮する必要があります。

MySQLクラスタリングとは何ですか?MySQLクラスタリングとは何ですか?Apr 30, 2025 am 12:28 AM

mysqlclusteringenhancesdatabaserobustnessnessnessnessnessnistandistributiondistributingdataacrossmultiplenodes.itesthendbenginefordatareplication andfaulttolerance、保証highavailability.setupinvolvesconfiguringmanagement、data、ssqlnodes、carefulmonitoringringandpe

MySQLのパフォーマンスのためにデータベーススキーマ設計を最適化するにはどうすればよいですか?MySQLのパフォーマンスのためにデータベーススキーマ設計を最適化するにはどうすればよいですか?Apr 30, 2025 am 12:27 AM

MySQLのデータベーススキーマ設計の最適化は、次の手順を通じてパフォーマンスを改善できます。1。インデックス最適化:一般的なクエリ列にインデックスを作成し、クエリのオーバーヘッドのバランスをとり、更新を挿入します。 2。テーブル構造の最適化:正規化または反通常化によりデータ冗長性を削減し、アクセス効率を改善します。 3。データ型の選択:Varcharの代わりにINTなどの適切なデータ型を使用して、ストレージスペースを削減します。 4。パーティション化とサブテーブル:大量のデータボリュームの場合、パーティション化とサブテーブルを使用してデータを分散させてクエリとメンテナンスの効率を改善します。

MySQLのパフォーマンスをどのように最適化できますか?MySQLのパフォーマンスをどのように最適化できますか?Apr 30, 2025 am 12:26 AM

tooptimizemysqlperformance、soflowthesesteps:1)properindexingtospeedupqueries、2)useexplaintoanalyzeandoptimize Queryperformance、3)AductServerContingSettingStingsinginginnodb_buffer_pool_sizeandmax_connections、4)

データ処理と計算にMySQL関数を使用する方法データ処理と計算にMySQL関数を使用する方法Apr 29, 2025 pm 04:21 PM

MySQL関数は、データ処理と計算に使用できます。 1.基本的な使用には、文字列処理、日付計算、数学操作が含まれます。 2。高度な使用法には、複数の関数を組み合わせて複雑な操作を実装することが含まれます。 3.パフォーマンスの最適化では、Where句での機能の使用を回避し、GroupByおよび一時テーブルを使用する必要があります。

MySQLにデータを挿入する効率的な方法MySQLにデータを挿入する効率的な方法Apr 29, 2025 pm 04:18 PM

MySQLでデータを挿入するための効率的な方法には、次のものが含まれます。1。insertInto ...値構文、2。LoadDatainFileコマンドの使用、3。トランザクション処理の使用、4。バッチサイズの調整、5。Insurtignoreまたは挿入の使用...

フィールドをMySQLテーブルに追加および削除する手順フィールドをMySQLテーブルに追加および削除する手順Apr 29, 2025 pm 04:15 PM

MySQLでは、AlterTabletable_nameaddcolumnnew_columnvarchar(255)afterexisting_columnを使用してフィールドを追加し、andtabletable_namedopcolumncolumn_to_dropを使用してフィールドを削除します。フィールドを追加するときは、クエリのパフォーマンスとデータ構造を最適化する場所を指定する必要があります。フィールドを削除する前に、操作が不可逆的であることを確認する必要があります。オンラインDDL、バックアップデータ、テスト環境、および低負荷期間を使用したテーブル構造の変更は、パフォーマンスの最適化とベストプラクティスです。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!