利用VC++程式設計實現程式自動啟動 (轉)

worldblog發表於2007-12-08
利用VC++程式設計實現程式自動啟動 (轉)[@more@]摘要:在工作中經常遇到一些,當啟動時會自動將該程式載入,以實現對計算機的等特殊的目的。本文就針對這個問題,闡述了載入特定程式的原理和方法,同時利用VC++ 6.0實現這種特定的功能的,並對其中的關鍵程式碼進行了分析。

工作中經常遇到一些程式,它們在系統啟動的過程中,自動開啟並執行,以便實現對系統的監控或者的檢測等特定的目的,典型的例子就是常用的一些如:KV300及等。筆者在此,以自己的程式設計實踐為基礎,說明這些這些程式自動啟動的原理和方法,同時對一些典型程式程式碼進行分析,以便讀者在今後的程式設計過程中使用。

一、 程式自動啟動的原理及方法:
1. 利用WIN.INI實現相關程式的自動啟動
WIN.INI是系統儲存在C:目錄下的一個系統初始化檔案。系統在起動時會檢索該檔案中的相關項,以便對系統環境的初始設定。
在該檔案中的"[windows]"資料段中,有兩個資料項"load="和"run=",它們的作用就是在系統起動之後自動得裝入和執行相關的程式。如果我們需要在系統起動之後裝入並執行一個程式,只將需要執行檔案的全檔名新增在該資料項的後面系統起動後就會自動執行該程式,系統也會進入特定的操作環境中去。
2. 利用登錄檔實現相關程式的自動啟動
系統登錄檔儲存著系統的軟體、及其他與系統有關的重要資訊,一個計算機系統的系統登錄檔一旦遭到破壞,整個系統將無法執行。
在計算機的系統登錄檔中的子目錄中有一個目錄的名稱為HKEY_LOCAL_MACHINESoftware WindowsCurrent_VersionRun,如果你想讓程式在系統起動的過程中啟動該程式,就可以向該目錄新增一個子項,具體的過程是在登錄檔中右擊該項,選中其中的"新建"專案,然後選中其中的"串值",建立新的串值後將它的名稱改成相應的名稱,雙擊新建的串值,輸入新的數值,自動啟動程式的過程就設定完成。
二、 利用VC++程式設計實現程式自動啟動的程式設計例項。
公司提供的VC++ 6.0程式開發工具功能非常強大。在VC++ 6.0中同時具有對登錄檔和*.INI檔案操作的。筆者經過一段時間的摸索,成功的利用VC++ 6.0開發成功了一個小軟體,該軟體利用系統自動啟動程式的原理,將原來需要的繁瑣的手動工作轉變成成計算機的自動設定工作,使系統自動啟動相關程式的設定工作變的非常簡單可靠。
1.程式功能概述:
程式的主介面是對話方塊,在主介面對話方塊中有編輯框(EDIT BOX),圓形按鈕(RADIO BUTTON)和普通按鈕(COMMON BUTTON)組成。操作者透過向編輯框中新增需要自動載入的程式的全檔名(也可以透過瀏覽按鈕來完成),然後透過對兩個RADIO BUTTON的選擇,進而完成對載入方式的選擇(是選用登錄檔方式還是選者修改WIN.INI檔案的方式),最後操作者透過點選"應用"按鈕實現程式的自動載入功能,同時系統會提示操作者是否將操作計算機重新啟動,以便觀察程式的具體功能完成情況。程式在中執行正常。
2.編碼說明:
① 瀏覽按鈕的功能程式碼:
void CAutoloadDlg::OnLiulan()
{
// TODO: Add your control notification handler code here
CFileDialog fileDlg(TRUE,_T("EXE"),_T("*.exe"),OFN_HREADONLY|OFN_OVERWRITEPROMPT,(_T("Executable Files (*.exe) |*.exe ||")));//顯示開啟檔案的對話方塊
if(fileDlg.odal()==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;
}
D 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.dwPlatfod==VER_PLATFORM__WINDOWS)
{
ExitWindowsEx(EWX_REBOOT,0);//重新啟動計算機
}
CDialog::OnOK();
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989821/,如需轉載,請註明出處,否則將追究法律責任。

相關文章