时间: 2021-07-31 作者:daque
樊永军 处事中常常遇到少许步调,它们在体例启用的进程中,机动翻开并运转,再不实行对体例的监察和控制大概宏病毒的检验和测定等一定的手段,典范的例子即是常用的少许杀毒软硬件如:kv300及瑞星杀毒软硬件等。笔者在此,以本人的编制程序试验为普通,证明那些那些步调机动启用的道理和本领,同声对少许典范步调代码举行领会,再不读者群在此后的编制程序进程中运用。 一、 步调机动启用的道理及本领: 1. 运用win.ini文献实行关系步调的机动启用 win.ini是体例生存在c:\windows\目次下的一个体例初始化文献。体例在起动时会检索该文献中的关系项,再不对体例情况的初始树立。 在该文献中的"[windows]"数据段中,有两个数据项"load="和"run=",它们的效率即是在体例起动之后机动得装入和运转关系的步调。即使咱们须要在体例起动之后装入并运转一个步调,只将须要运转文献的全文献名增添在该数据项的反面体例起动后就会机动运转该步调,体例也会加入一定的操纵情况中去。 2. 运用备案表实行关系步调的机动启用 体例备案表生存着体例的软硬件、硬件及其余与体例摆设相关的要害消息,一个计划机体例的体例备案表一旦受到妨害,所有体例将没辙运转。 在计划机的体例备案表中的子目次中有一个目次的称呼为hkey_local_machine\software \microsoft\windows\current_version\run,即使你想让步调在体例起动的进程中启用该步调,就不妨向该目次增添一个子项,简直的进程是在备案表中右击该项,选中个中的"兴建"名目,而后选中个中的"串值",创造新的串值后将它的称呼改成相映的称呼,双击兴建的串值,输出新的数值,机动启用步调的进程就树立实行。 二、 利用VC++编程实现程序自动启动的编制程序范例。 微软公司供给的vc++ 6.0步调开拓东西功效特殊宏大。在vc++ 6.0中同声具备对备案表和*.ini文献操纵的因变量。笔者过程一段功夫的探求,胜利的运用vc++ 6.0开拓胜利了一个小软硬件,该软硬件运用体例机动启用步调的道理,将从来须要的烦琐的手开工作变化成成计划机的机动树立处事,使体例机动启用关系步调的树立处事变的特殊大略真实。 1.步调功效概括: 步调的主界面是对话框,在主界面临话框中有编纂框(edit box),圆形按钮(radio button)和普遍按钮(common button)构成。操作家经过向编纂框中增添须要机动加载的步调的全文献名(也不妨经过欣赏按钮来实行),而后经过对两个radio button的采用,从而实行对加载办法的采用(是采用备案表办法仍旧选者窜改win.ini文献的办法),结果操作家经过点击"运用"按钮实行步调的机动加载功效,同声体例会提醒操作家能否将操纵计划机从新启用,再不查看步调的简直功效实行情景。步调在win9第88中学调节和测试运转平常。 2.源代码证明: ① 欣赏按钮的功效代码: void cautoloaddlg::onliulan() { // todo: add your control notification handler code here cfiledialog filedlg(true,_t("exe"),_t("*.exe"),ofn_hidereadonly|ofn_overwriteprompt,(_t("executable files (*.exe) |*.exe ||")));//表露翻开文献的对话框 if(filedlg.domodal()==idok)//当操作家采用ok时,步调,博得采用文//件的全路途名(囊括文献的路途及文献称呼),并将相映的数值传输给相//关的控件变量。 { m_filename=filedlg.getpathname();//m_filename是edit box控件的相映的变量。 updatedata(false);//向将变量中的数值传输给控件表露出来。 } } ② 运用按钮的功效代码: void cautoloaddlg::onok() { // todo: add extra validation here lpctstr title; updatedata(true); if(m_title.isempty())//即使操作家没有填写要树立项的题目,步调表露对话框,提醒操作家举行关系的填写。 { messagebox(_t("please input the title name")); return; } title=m_title; if(m_filename.isempty())//即使操作家没有采用要树立的步调的全路途文//件名,步调表露对话框,提醒操作家举行关系的采用。 { messagebox(_t("please input the programe file name")); return; } if(isdlgbuttonchecked(idc_radio1))//即使操作家采用备案表办法,步调窜改体例的备案表。 { hkey hkey; lpctstr data_set="software\\microsoft\\windows\\currentversion\\run";//树立备案表中关系的路途 longret0=(::regopenkeyex(hkey_local_machine,data_set,0,key_write,&hkey));//翻开备案表中的相映项 if(ret0!=error_success) { messagebox("缺点0"); } int length=m_filename.getlength()+1;//将控件中的实质举行变换,以到达备案表窜改因变量的参数挪用需要。 for(int i=0;i { if(m_filename[i]==92) length=length+1; } dword cbdata=length; lpbyte lpb=new byte[length]; int j=0; for(i=0;i { if(m_filename[i]==92) { lpb[j]=92; j++; lpb[j]=92; j++; } else { lpb[j]=m_filename[i]; j++; } } lpb[j]=0; long ret1=(::regsetvalueex(hkey,title,null,reg_sz,lpb,cbdata));//将关系的消息写入备案表。 if(ret1!=error_success)//确定体例的关系备案能否胜利? { messagebox("缺点1"); } delete lpb; ::regclosekey(hkey);//封闭备案表中的相映的项 } if(isdlgbuttonchecked(idc_radio2))//即使操作家采用用窜改win.ini文献的办法 { lpctstr filename; filename=m_filename; writeprivateprofilestring(_t("windows"),_t("load"),filename,_t("c:\\windows\\win.ini")); writeprivateprofilestring(_t("windows"),_t("run"),filename,_t("c:\\windows\\win.ini")); } yzdlg.domodal();//表露对话框,提醒操作家能否须要从新启用计划机,再不考证步调的功效。 cdialog::onok(); } ③ 从新启用按钮的功效代码: void yanzheng::onok() { osversioninfo osverinfo;//生存体例本子消息的数据构造 osverinfo.dwosversioninfosize=sizeof(osversioninfo); getversionex(&osverinfo);//博得体例的本子消息 if(osverinfo.dwplatformid==ver_platform_win32_windows) { exitwindowsex(ewx_reboot,0);//从新启用计划机 } cdialog::onok(); }