利用VC++编程实现程序自动启动

2016-02-19 18:07 17 1 收藏

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的利用VC++编程实现程序自动启动懂设计的网友们快点来了解吧!

【 tulaoshi.com - 编程语言 】

工作中经常碰到一些程序,它们在系统启动的过程中,自动打开并运行,以便实现对系统的监控或者病毒的检测等特定的目的,典型的例子就是常用的一些杀毒软件如:KV300及瑞星杀毒软件等。笔者在此,以自己的编程实践为基础,说明这些程序自动启动的原理和方法,同时对一些典型程序代码进行分析,以便读者在今后的编程过程中使用。
  
  一、 程序自动启动的原理及方法:
  
  1. 利用WIN.INI文件实现相关程序的自动启动
  
  WIN.INI是系统保存在C:WINDOWS目录下的一个系统初始化文件。系统在起动时会检索该文件中的相关项,以便对系统环境的初始设置。
  
  在该文件中的"[windows]"数据段中,有两个数据项"load="和"run=",它们的作用就是在系统起动之后自动得装入和运行相关的程序。假如我们需要在系统起动之后装入并运行一个程序,只将需要运行文件的全文件名添加在该数据项的后面系统起动后就会自动运行该程序,系统也会进入特定的操作环境中去。
  
  2. 利用注册表实现相关程序的自动启动
  
  

  
  系统注册表保存着系统的软件、硬件及其他与系统配置有关的重要信息,一个计算机系统的系统注册表一旦遭到破坏,整个系统将无法运行。
  
  在计算机的系统注册表中的子目录中有一个目录的名称为HKEY_LOCAL_MACHINESoftware MicrosoftWindowsCurrent_VersionRun,假如你想让程序在系统起动的过程中启动该程序,就可以向该目录添加一个子项,具体的过程是在注册表中右击该项,选中其中的"新建"项目,然后选中其中的"串值",建立新的串值后将它的名称改成相应的名称,双击新建的串值,输入新的数值,自动启动程序的过程就设置完成。
  
  二、 利用VC++编程实现程序自动启动的编程实例。
  
  微软公司提供的VC++ 6.0程序开发工具功能非常强大。在VC++ 6.0中同时具有对注册表和*.INI文件操作的函数。笔者经过一段时间的摸索,成功的利用VC++ 6.0开发成功了一个小软件,该软件利用系统自动启动程序的原理,将原来需要的繁琐的手动工作转变成成计算机的自动设置工作,使系统自动启动相关程序的设置工作变的非常简单可靠。
  
  1.程序功能概述:
  
  程序的主界面是对话框,在主界面对话框中有编辑框(EDIT BOX),圆形按钮(RADIO BUTTON)和普通按钮(COMMON BUTTON)组成。操作者通过向编辑框中添加需要自动加载的程序的全文件名(也可以通过浏览按钮来完成),然后通过对两个RADIO BUTTON的选择,进而完成对加载方式的选择(是选用注册表方式还是选者修改WIN.INI文件的方式),最后操作者通过点击"应用"按钮实现程序的自动加载功能,同时系统会提示操作者是否将操作计算机重新启动,以便观察程序的具体功能完成情况。程序在WIN98中调试运行正常。
  
  2.编码说明:
  
  ① 浏览按钮的功能代码:
  
  void CAutoloadDlg::OnLiulan()
  
  {
  
  // TODO: Add your control notification handler code here
  
  CFileDialog fileDlg(TRUE,_T("EXE"),_T("*.exe"),OFN_HIDEREADONLYOFN_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="SoftwareMicrosoftWindowsCurrentVersionRun";//设置注册表中相关的路径
  
  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:windowswin.ini"));
  
  WritePrivateProfileString(_T("windows"),_T("run"),filename,_T("c:windowswin.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();
   }

来源:http://www.tulaoshi.com/n/20160219/1616858.html

延伸阅读
目前,不少流行软件都提供有对外挂插件的支持功能,如Winamp、Realplay等等。这些软件通过对插件技术的使用为日后的软件升级和功能扩展提供了相当的便利条件。尤为重要的是,通过使用插件技术,使得对软件的功能扩展将不再完全受限于软件厂商,任何第三方开发商或是程序员个人只要遵循了软件提供的插件接口标准去开发插件就完全可以同主体...
滑动控件是Windows中最常用的控件之一。一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值。通常,在滑动控件附近一定有标签控件或编辑框控件,用于显示相应的值。滑动控件在应用程序中用途级为广泛,如在桌面的属性中就可以看到。为此,让我们一起来看一下它的实现方法。 (...
SNMP(Simple Network Management Protocol)是基于TCP/IP的网络管理协议,关于其工作原理网上很多,百度一下或者看看MSDN,今天在这里记一下实现的步骤,本人工作环境是Windows XP professional SP2 + Microsoft Visual Studio .net 2003,不保证其他平台与本人的步骤一致。 一、安装SNMP服务 先查看系统中是否已经安装有SNMP...
*假设调试机IP 192.168.0.182   远程机IP 192.168.0.161 *远程机为调试机分配权限,使调试机可以使用远程桌面登陆到远程机器上(这样调试起来方便)。 *调试机上安装visual studio .net 2003 共享调试机上的Visual Studio上的远程调试目录(以我的机器为例) C:Program FilesMicrosoft Visual Studio .NET 2003Common7PackagesDe...
概述 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信...

经验教程

574

收藏

54
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部