程序自啟動的原理
程序自啟動有以下兩種方式:
1. 利用Win.ini文件實現(xiàn)
程序的自動啟動
Win.ini是系統(tǒng)保存在“C:Windows”目錄下的一個系統(tǒng)初始化文件,系統(tǒng)在啟動時會檢索該文件中的相關項,以進行系統(tǒng)環(huán)境的初始設置。在該文件中的“[windows]”數(shù)據(jù)段中,有兩個數(shù)據(jù)項“l(fā)oad=”和“run=”,它們的作用就是在系統(tǒng)啟動之后自動地裝入和運行相關的
程序。如果我們需要在系統(tǒng)啟動之后立即裝入并運行一個
程序,只需要將運行文件的全文件名添加在該數(shù)據(jù)項的后面,系統(tǒng)啟動后就會自動運行該
程序,系統(tǒng)也會進入特定的操作環(huán)境中。
2. 利用注冊表實現(xiàn)相關
程序的自動啟動
系統(tǒng)注冊表保存著系統(tǒng)的軟件、硬件及其他與系統(tǒng)配置有關的重要信息,一個計算機系統(tǒng)的系統(tǒng)注冊表一旦遭到破壞,整個系統(tǒng)將無法運行。在計算機系統(tǒng)注冊表中有HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current_Version/Run子鍵,如果要讓
程序在系統(tǒng)啟動的過程中啟動該
程序,就可以向該目錄添加一個子鍵。具體的過程是在注冊表中右擊該項,選中其中的“新建”項目,然后選中其中的“串值”,建立新的串值后將它改成相應的名稱,雙擊新建的串值,輸入新的數(shù)值,自動啟動
程序的過程就設置完成。
編程實例
在Delphi 5.0中同時具有對注冊表和INI文件操作的函數(shù)。下面是筆者編寫的一個簡單
程序,該
程序通過修改注冊表和INI文件,使系統(tǒng)自動啟動,相關
程序的設置工作比較簡單可靠。
1.
程序功能概述
程序的主界面是對話框,在主界面對話框中有兩個編輯框、一個按鈕組、一個打開文件對話框、兩個普通按鈕(Button)組成。操作者先在編輯框中添加需要自動加載的
程序全文件名(也可以通過瀏覽按鈕來完成),然后通過按鈕組中兩個按鈕完成加載方式的選擇(注冊表方式或者修改Win.ini文件的方式),最后操作者通過點擊“應用”按鈕實現(xiàn)
程序的自動加載,同時系統(tǒng)會提示操作者是否將計算機重新啟動,以便觀察
程序的具體功能完成情況。
2.
程序代碼
procedure TForm1.Button1Click(Sender: TObject);
{瀏覽按鈕的功能代碼}
begin
if (OpenDlg.Execute) then
{當操作者選擇OK時,
程序取得選擇文件的全路徑名(包括文件的路徑及文件名稱),并將相應的數(shù)值傳輸給相關的
控件變量。}
Edit2.Text := OpenDlg.FileName;
end;
procedure TForm1.OKBtnClick(Sender: TObject);
{應用按鈕的功能代碼}
Var
lKey: HKey;
i,len: integer;
title, data_set: LPCTSTR;
ret0,ret1: longint;
filename: String;
begin
if (edit1.Text =‘’) THEN
{如果操作者沒有填寫要設置項的標題,
程序顯示對話框,提示操作者進行相關內(nèi)容的填寫。}
begin
Application.MessageBox(‘Please input the title name’,‘提示’,MB_OK);
EXIT;
end;
title:=PChar(edit1.Text);
if (edit2.text =‘’)THEN
{如果操作者沒有選擇要設置的
程序全路徑文件名,
程序顯示對話框提示操作者進行相關的選擇。}
begin
Application.MessageBox(‘Please input the programe file name’,‘提示’,MB_OK);
exit;
end;
if (RadioGroup1.ItemIndex = 0) then
{如果操作者選擇注冊表方式,
程序修改系統(tǒng)的注冊表。}
begin
data_Set:=‘SoftwareMicrosoft
WindowsCurrentVersionRun’;
{設置注冊表中相關的路徑}
ret0:=RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_WRITE, lKey);
//打開注冊表中的相應項
if (ret0<>ERROR_SUCCESS) then
Application.MessageBox(‘錯誤0’,‘提示’,MB_OK);
len := Length(Trim(Edit2.text))+1;
filename := Trim(Edit2.text);
for i:=0 to Length(filename) do
if(filename[i]=‘’)then
len:=len+1;
ret1:=RegSetValueEx(lKey,PChar(title),0,REG_SZ,Pchar(filename),len);
//將相關的信息寫入注冊表。
if(ret1<>ERROR_SUCCESS) then
//判斷系統(tǒng)的相關注冊是否成功?
Application.MessageBox(‘錯誤1’,‘提示’,MB_OK);
RegCloseKey(lKey);
//關閉注冊表中的相應的項
end
else begin
WritePrivateProfileString(‘windows’,‘load’, PChar(filename),‘c:windowswin.ini’);
WritePrivateProfileString(‘windows’,‘run’, PChar(filename),‘c:windowswin.ini’);
end;
VerifyDlg.ShowModal;
{顯示對話框,提示操作者是否需要重新啟動計算機,以便驗證
程序的功能。}
end;
procedure TVerifyDlg.OKBtnClick(Sender: TObject);
{重新啟動按鈕的功能代碼}
var
OsVerInfo:OSVERSIONINFO;
//保存系統(tǒng)版本信息的數(shù)據(jù)結構
Begin
OsVerInfo.dwOSVersionInfoSize:=sizeof(OSVERSIONINFO);
GetVersionEx(OsVerInfo);
//取得系統(tǒng)的版本信息
if(OsVerInfo.dwPlatformId=VER_PLATFORM
_WIN32_WINDOWS) then
ExitWindowsEx(EWX_REBOOT,0);
//重新啟動計算機
end;