evc小项目杂记(2)
两个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>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

iPhone上的預設地圖是Apple專有的地理位置供應商「地圖」。儘管地圖越來越好,但它在美國以外的地區運作不佳。與谷歌地圖相比,它沒有什麼可提供的。在本文中,我們討論了使用Google地圖成為iPhone上的預設地圖的可行性步驟。如何在iPhone中使Google地圖成為預設地圖將Google地圖設定為手機上的預設地圖應用程式比您想像的要容易。請依照以下步驟操作–先決條件步驟–您必須在手機上安裝Gmail。步驟1–開啟AppStore。步驟2–搜尋“Gmail”。步驟3–點選Gmail應用程式旁

C++是一種廣泛使用的程式語言,在編寫倒數計時器方面非常方便且實用。倒數計時程式是一種常見的應用,它能為我們提供非常精確的時間計算和倒數功能。本文將介紹如何使用C++來寫一個簡單的倒數計時程式。實現倒數程序的關鍵就是使用計時器來計算時間的流逝。在C++中,我們可以使用time.h頭檔中的函數來實作計時器的功能。下面是一個簡單的倒數計時程式的程式碼

您的手機中缺少時鐘應用程式嗎?日期和時間仍將顯示在iPhone的狀態列上。但是,如果沒有時鐘應用程序,您將無法使用世界時鐘、碼錶、鬧鐘等多項功能。因此,修復時鐘應用程式的缺失應該是您的待辦事項清單的首位。這些解決方案可以幫助您解決此問題。修復1–放置時鐘應用程式如果您錯誤地從主畫面中刪除了時鐘應用程序,您可以將時鐘應用程式放回原位。步驟1–解鎖iPhone並開始向左側滑動,直到到達「應用程式庫」頁面。步驟2–接下來,在搜尋框中搜尋「時鐘」。步驟3–當您在搜尋結果中看到下方的「時鐘」時,請按住它並

您是否每天在大約相同的時間頻繁地造訪同一網站?這可能會導致花費大量時間打開多個瀏覽器選項卡,並在執行日常任務時使瀏覽器充滿混亂。好吧,打開它而不必手動啟動瀏覽器怎麼樣?這非常簡單,不需要您下載任何第三方應用程序,如下所示。如何設定任務計劃程序以開啟網站?按鍵,在搜尋框中鍵入任務計劃程序,然後按一下開啟。 Windows在右側側邊欄上,按一下「建立基本任務」選項。在名稱欄位中,輸入要開啟的網站的名稱,然後按一下下一步。接下來,在觸發器下,按一下時間頻率並點擊下一步。選擇您希望活動重複多長時間並點擊下一步。選擇啟

furmark怎麼看?1、在主介面中設定“運行模式”和“顯示模式”,還能調整“測試模式”,點擊“開始”按鈕。 2.等待片刻後,就會看到測試結果,包含了顯示卡各種參數。 furmark怎麼算合格? 1.用furmark烤機,半小時左右看一下結果,基本上在85度左右徘徊,峰值87度,室溫19度。大號機箱,5個機殼風扇口,前置兩個,上置兩個,後置一個,不過只裝了一個風扇。所有配件都沒有超頻。 2.一般情況下,顯示卡的正常溫度應在「30-85℃」之間。 3.就算是大夏天周圍環境溫度過高,正常溫度也是「50-85℃

您在嘗試使用應用程式時是否收到“無法允許存取攝影機和麥克風”?通常,您可以在需要提供的基礎上向特定物件授予攝影機和麥克風權限。但是,如果您拒絕權限,攝影機和麥克風將無法運作,而是顯示此錯誤訊息。解決這個問題是非常基本的,你可以在一兩分鐘內完成。修復1–提供相機、麥克風權限您可以直接在設定中提供必要的攝影機和麥克風權限。步驟1–轉到“設定”選項卡。步驟2–打開「隱私與安全」面板。步驟3–在那裡打開“相機”權限。步驟4–在裡面,您將找到已要求手機相機權限的應用程式清單。步驟5–開啟指定應用的“相機”

新派幻想仙俠MMORPG《誅仙2》「無為測試」即將於4月23日開啟,在原著千年後的誅仙大陸,會發生怎樣的全新仙俠冒險故事?六境仙俠大世界,全職修仙學府,自由自在的修仙生活,仙界中的萬般妙趣都在等待著仙友們親自前往探索! 「無為測試」預先下載現已開啟,仙友們可前往官網下載,開服前無法登入遊戲伺服器,啟動碼可在預先下載安裝完成後使用。 《誅仙2》「無為測試」開放時間:4月23日10:00——5月6日23:59誅仙正統續作全新仙俠冒險篇章《誅仙2》以《誅仙》小說為藍圖,在繼承原著世界觀的基礎上,將遊戲背景設

《三角洲行動》將在今日(3月7日)開啟一場名為「代號:ZERO」的大規模PC測試。而在上週末,這款遊戲在上海舉辦了一次線下快閃體驗活動,17173也有幸受邀參與其中。這次測試距離上一次僅相隔四個多月,不禁讓我們好奇,在這麼短的時間內,《三角洲行動》將會帶來哪些新的亮點與驚喜?四個多月前,我已先行在線下品鑑會和首測版本中體驗了《三角洲行動》。當時,遊戲僅開放了「危險行動」這個模式。然而,《三角洲行動》在當時的表現已然令人矚目。在各大廠商紛紛湧向手遊市場的背景下,如此一款與國際水準相媲美的FPS
