利用VC++編程實(shí)現(xiàn)程序自動(dòng)啟動(dòng)
工作中經(jīng)常遇到一些程序,它們?cè)谙到y(tǒng)啟動(dòng)的過(guò)程中,自動(dòng)打開(kāi)并運(yùn)行,以便實(shí)現(xiàn)對(duì)系統(tǒng)的監(jiān)控或者病毒的檢測(cè)等特定的目的,典型的例子就是常用的一些殺毒軟件如:KV300及瑞星殺毒軟件等。筆者在此,以自己的編程實(shí)踐為基礎(chǔ),說(shuō)明這些這些程序自動(dòng)啟動(dòng)的原理和方法,同時(shí)對(duì)一些典型程序代碼進(jìn)行分析,以便讀者在今后的編程過(guò)程中使用。一、 程序自動(dòng)啟動(dòng)的原理及方法:
1. 利用WIN.INI文件實(shí)現(xiàn)相關(guān)程序的自動(dòng)啟動(dòng)
WIN.INI是系統(tǒng)保存在C:\WINDOWS\目錄下的一個(gè)系統(tǒng)初始化文件。系統(tǒng)在起動(dòng)時(shí)會(huì)檢索該文件中的相關(guān)項(xiàng),以便對(duì)系統(tǒng)環(huán)境的初始設(shè)置。
在該文件中的"[windows]"數(shù)據(jù)段中,有兩個(gè)數(shù)據(jù)項(xiàng)"load="和"run=",它們的作用就是在系統(tǒng)起動(dòng)之后自動(dòng)得裝入和運(yùn)行相關(guān)的程序。如果我們需要在系統(tǒng)起動(dòng)之后裝入并運(yùn)行一個(gè)程序,只將需要運(yùn)行文件的全文件名添加在該數(shù)據(jù)項(xiàng)的后面系統(tǒng)起動(dòng)后就會(huì)自動(dòng)運(yùn)行該程序,系統(tǒng)也會(huì)進(jìn)入特定的操作環(huán)境中去。
2. 利用注冊(cè)表實(shí)現(xiàn)相關(guān)程序的自動(dòng)啟動(dòng)
系統(tǒng)注冊(cè)表保存著系統(tǒng)的軟件、硬件及其他與系統(tǒng)配置有關(guān)的重要信息,一個(gè)計(jì)算機(jī)系統(tǒng)的系統(tǒng)注冊(cè)表一旦遭到破壞,整個(gè)系統(tǒng)將無(wú)法運(yùn)行。
在計(jì)算機(jī)的系統(tǒng)注冊(cè)表中的子目錄中有一個(gè)目錄的名稱為HKEY_LOCAL_MACHINE\Software \Microsoft\Windows\Current_Version\Run,如果你想讓程序在系統(tǒng)起動(dòng)的過(guò)程中啟動(dòng)該程序,就可以向該目錄添加一個(gè)子項(xiàng),具體的過(guò)程是在注冊(cè)表中右擊該項(xiàng),選中其中的"新建"項(xiàng)目,然后選中其中的"串值",建立新的串值后將它的名稱改成相應(yīng)的名稱,雙擊新建的串值,輸入新的數(shù)值,自動(dòng)啟動(dòng)程序的過(guò)程就設(shè)置完成。
二、 利用VC++編程實(shí)現(xiàn)程序自動(dòng)啟動(dòng)的編程實(shí)例。
微軟公司提供的VC++ 6.0程序開(kāi)發(fā)工具功能非常強(qiáng)大。在VC++ 6.0中同時(shí)具有對(duì)注冊(cè)表和*.INI文件操作的函數(shù)。筆者經(jīng)過(guò)一段時(shí)間的摸索,成功的利用VC++ 6.0開(kāi)發(fā)成功了一個(gè)小軟件,該軟件利用系統(tǒng)自動(dòng)啟動(dòng)程序的原理,將原來(lái)需要的繁瑣的手動(dòng)工作轉(zhuǎn)變成成計(jì)算機(jī)的自動(dòng)設(shè)置工作,使系統(tǒng)自動(dòng)啟動(dòng)相關(guān)程序的設(shè)置工作變的非常簡(jiǎn)單可靠。
1.程序功能概述:
程序的主界面是對(duì)話框,在主界面對(duì)話框中有編輯框(EDIT BOX),圓形按鈕(RADIO BUTTON)和普通按鈕(COMMON BUTTON)組成。操作者通過(guò)向編輯框中添加需要自動(dòng)加載的程序的全文件名(也可以通過(guò)瀏覽按鈕來(lái)完成),然后通過(guò)對(duì)兩個(gè)RADIO BUTTON的選擇,進(jìn)而完成對(duì)加載方式的選擇(是選用注冊(cè)表方式還是選者修改WIN.INI文件的方式),最后操作者通過(guò)點(diǎn)擊"應(yīng)用"按鈕實(shí)現(xiàn)程序的自動(dòng)加載功能,同時(shí)系統(tǒng)會(huì)提示操作者是否將操作計(jì)算機(jī)重新啟動(dòng),以便觀察程序的具體功能完成情況。程序在WIN98中調(diào)試運(yùn)行正常。
2.編碼說(shuō)明:
① 瀏覽按鈕的功能代碼:
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 ||")));//顯示打開(kāi)文件的對(duì)話框
if(fileDlg.DoModal()==IDOK)//當(dāng)操作者選擇OK時(shí),程序,取得選擇文//件的全路徑名(包括文件的路徑及文件名稱),并將相應(yīng)的數(shù)值傳輸給相//關(guān)的控件變量。
{
m_filename=fileDlg.GetPathName();//m_filename是EDIT BOX控件的相應(yīng)的變量。
UpdateData(FALSE);//向?qū)⒆兞恐械臄?shù)值傳輸給控件顯示出來(lái)。
}
}
② 應(yīng)用按鈕的功能代碼:
void CAutoloadDlg::OnOK()
{
// TODO: Add extra validation here
LPCTSTR title;
UpdateData(TRUE);
if(m_title.IsEmpty())//如果操作者沒(méi)有填寫要設(shè)置項(xiàng)的標(biāo)題,程序顯示對(duì)話框,提示操作者進(jìn)行相關(guān)的填寫。
{
MessageBox(_T("Please input the title name"));
return;
}
title=m_title;
if(m_filename.IsEmpty())//如果操作者沒(méi)有選擇要設(shè)置的程序的全路徑文//件名,程序顯示對(duì)話框,提示操作者進(jìn)行相關(guān)的選擇。
{
MessageBox(_T("Please input the programe file name"));
return;
}
if(IsDlgButtonChecked(IDC_RADIO1))//如果操作者選擇注冊(cè)表方式,程序修改系統(tǒng)的注冊(cè)表。
{
HKEY hKey;
LPCTSTR data_Set="Software\\Microsoft\\Windows\\CurrentVersion\\Run";//設(shè)置注冊(cè)表中相關(guān)的路徑
Longret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_WRITE,&hKey));//打開(kāi)注冊(cè)表中的相應(yīng)項(xiàng)
if(ret0!=ERROR_SUCCESS)
{
MessageBox("錯(cuò)誤0");
}
int length=m_filename.GetLength()+1;//將控件中的內(nèi)容進(jìn)行轉(zhuǎn)換,以達(dá)到注冊(cè)表修改函數(shù)的參數(shù)調(diào)用需求。
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));//將相關(guān)的信息寫入注冊(cè)表。
if(ret1!=ERROR_SUCCESS)//判斷系統(tǒng)的相關(guān)注冊(cè)是否成功?
{
MessageBox("錯(cuò)誤1");
}
delete lpb;
::RegCloseKey(hKey);//關(guān)閉注冊(cè)表中的相應(yīng)的項(xiàng)
}
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();//顯示對(duì)話框,提示操作者是否需要重新啟動(dòng)計(jì)算機(jī),以便驗(yàn)證程序的功能。
CDialog::OnOK();
}
?、?重新啟動(dòng)按鈕的功能代碼:
void yanzheng::OnOK()
{
OSVERSIONINFO OsVerInfo;//保存系統(tǒng)版本信息的數(shù)據(jù)結(jié)構(gòu)
OsVerInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&OsVerInfo);//取得系統(tǒng)的版本信息
if(OsVerInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
ExitWindowsEx(EWX_REBOOT,0);//重新啟動(dòng)計(jì)算機(jī)
}
CDialog::OnOK();
}
posted on 2005-07-27 10:20 春雷的博客 閱讀(184) 評(píng)論(0) 編輯 收藏