利用VC++編程實現程序自動啓動

利用VC++編程實現程序自動啓動
 
 

摘要:在工作中經常遇到一些程序,當計算機啓動時會自動將該程序加載,以實現對計算機的監控等特殊的目的。本文就針對這個問題,闡述了系統加載特定程序的原理和方法,同時利用VC++ 6.0編程實現這種特定的功能的,並對其中的關鍵代碼進行了分析。

工作中經常遇到一些程序,它們在系統啓動的過程中,自動打開並運行,以便實現對系統的監控或者病毒的檢測等特定的目的,典型的例子就是常用的一些殺毒軟件如: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_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="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==92)
length=length+1;
}
DWORD cbData=length;
LPBYTE lpb=new BYTE[length];
int j=0;
for(i=0;i{
if(m_filename==92)
{
lpb[j]=92;
j++;
lpb[j]=92;
j++;
}
else
{
lpb[j]=m_filename;
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();
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章