您好,欢迎访问一九零五行业门户网

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.txtint 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_mapend_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_mapend_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\\),llaunch80,_t(\\residentflash\\ourapp\\开关机测试v1.3.exe)); reg->deleteregvalue(hkey_local_machine,_t(init\\),llaunch80);
源码
/***************************************************************************$id$copyright (c) centerm information co.,ltd.all rights reserved. model name:reg.cpp description:注册表测试 environment:wince5.0、6.0 history: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); }} // 向注册表写入intvoid 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); }} // 向注册表写入dwordbool 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;} // 从注册表读取一个intdword 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,(lregflushkey [hkey_current_user]successed.\r\n)); } else { //retailmsg(debug_by_ahzit,(lregflushkey[hkey_current_user] failed.\r\n)); returnfalse; } dwret= regflushkey( hkey_local_machine ); if(error_success != dwret ) { //retailmsg(debug_by_ahzit,(lregflushkey[hkey_local_machine] failed, errorcode:[%ld].\r\n, dwret)); returnfalse; } else { //retailmsg(debug_by_ahzit,(lregflushkey [hkey_local_machine]successed.\r\n)); }#endif returntrue;}
/***************************************************************************$id$copyright (c) centerm information co.,ltd.all rights reserved. model name:reg.h description:注册表测试 environment:wince5.0、6.0 history: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();};
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;} //移除已经拨上去的rasvoid 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;iredialcnt= 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;}
其它类似信息

推荐信息