在Delphi程式中調用控制台設定功能
王發軍
應用程式運行時,有時需要對系統內容有特殊要求。例如,在Delphi資料庫應用程式中可能需要進行BDE(Borland Database Engine)或ODBC資料來源名稱(DSN:Data Source Name)的設定;在網路應用程式中可能需要進行網路設定設定、Modem屬性設定或使用者撥號連線的帳號和密碼的設定並儲存在系統中;在CTI(Computer-Telephony Integration)應用程式中可能需要進行電話撥號屬性的設定;在遊戲程式中可能需要對多媒體或遊戲控制器進行設定;等等。這時候就需要改變Windows系統的環境設定,以適應應用程式正常啟動並執行要求。當應用程式不能自行進行環境設定時,可能需要軟體使用者來參與、協助完成設定。
Win9X/NT的大多數系統設定是在控制台中進行的。我們可以要求使用者自己開啟控制台尋找相應的項目進行設定,此時要求使用者對控制台相當熟悉;也可以在程式中自動為使用者開啟控制台並選擇相應的項目,此時使用者所做的只是進行設定。後一種方法無疑更具有友好性,更能提高使用者的工作效率。
控制台的大多數項目設定,都對應Windows的System目錄下的一個CPL檔案,如“Internet”屬性對應的檔案為InetCpl.cpl、“多媒體”屬性對應的檔案為MmSys.cpl等。通過調用這些檔案可以開啟相應的屬性設定視窗,甚至可以跳到相應的屬性頁面如“Internet”屬性的“串連”屬性頁面,有效減少軟體使用者的操作步驟。
CPL檔案的調用格式為“RunDLL32.exe Shell32.dll,Control_RunDLL CPLFile.cpl,,ItemNo”(可參見註冊表中HKEY_CLASSES_ROOT/cplfile/shell/cplopen/command的預設值),其中CPLFile.cpl為CPL檔案,ItemNo為項目編號。在Delphi程式中,可以用WinExec或CreateProcess函數來實現CPL檔案調用,從而實現對控制台的設定項目的調用。如進行撥號連線的帳號和密碼設定要調用“Internet”屬性的“串連”屬性頁面,可以用語句“WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL InetCpl.cpl,,3’,, SW_SHOWNORMAL);”;解決2000年問題中對兩位年份輸入的解釋要調用“地區設定”的“日期”屬性頁面,可以用語句:“WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Intl.cpl,,4’,, SW_SHOWNORMAL);”。
控制台各項目設定調用所對應的語句列表如下:
//開啟控制台
WinExec(’RunDLL.exe Shell32.DLL,Control_RunDLL’,SW_SHOWNORMAL);
//32位ODBC資料來源管理器,ODBC資料來源、ODBC驅動程式設定
//沒有提供參數區分“使用者DSN”“系統DSN”“檔案DSN”“ODBC驅動程式”“跟蹤”“關於”六個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL ODBCCP32.CPL’,SW_SHOWNORMAL);
//BDE Adminstrator
//沒有提供參數區分“Databases”和“Configuration”兩個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL BdeAdmin.CPL’,SW_SHOWNORMAL);
//Internet 屬性,可有ItemNo參數
//“常規”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL InetCpl.cpl,,0’, SW_SHOWNORMAL);
//“安全”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL InetCpl.cpl,,1’, SW_SHOWNORMAL);
//“內容”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL InetCpl.cpl,,2’, SW_SHOWNORMAL);
//“串連”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL InetCpl.cpl,,3’, SW_SHOWNORMAL);
//“程式”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL InetCpl.cpl,,4’, SW_SHOWNORMAL);
//“進階”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL InetCpl.cpl,,5’, SW_SHOWNORMAL);
//電話撥號屬性,沒有提供參數區分“我的位置”和“電話語音驅動程式”兩個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Telephon.cpl’, SW_SHOWNORMAL);
//電源管理設定,沒有提供參數區分“電源配置”和“進階”兩個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL PowerCfg.cpl’, SW_SHOWNORMAL);
//數據機設定,沒有提供參數區分“常規”和“診斷”兩個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Modem.cpl’, SW_SHOWNORMAL);
//多媒體設定,可有ItemNo參數
//“音頻”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Mmsys.cpl,,0’, SW_SHOWNORMAL);
//“視頻”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Mmsys.cpl,,1’, SW_SHOWNORMAL);
//“MIDI”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Mmsys.cpl,,2’, SW_SHOWNORMAL);
//“CD音樂”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Mmsys.cpl,,3’, SW_SHOWNORMAL);
//“裝置”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Mmsys.cpl,,4’, SW_SHOWNORMAL);
//輔助選項設定,可有ItemNo參數
//“鍵盤”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL access.cpl,,1’,SW_SHOWNORMAL);
//“聲音”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL access.cpl,,2’, SW_SHOWNORMAL);
//“顯示”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL access.cpl,,3’, SW_SHOWNORMAL);
//“滑鼠”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL access.cpl,,4’, SW_SHOWNORMAL);
//“常規”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL access.cpl,,5’, SW_SHOWNORMAL);
//密碼設定,沒有提供參數區分“更改密碼”和“修改使用者配置”兩個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Password.cpl’, SW_SHOWNORMAL);
//地區設定,可有ItemNo參數
//“地區設定”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Intl.cpl,,0’, SW_SHOWNORMAL);
//“數字”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Intl.cpl,,1’, SW_SHOWNORMAL);
//“貨幣”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Intl.cpl,,2’, SW_SHOWNORMAL);
//“時間”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Intl.cpl,,3’, SW_SHOWNORMAL);
//“日期”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Intl.cpl,,4’, SW_SHOWNORMAL);
//日期/時間設定,可有ItemNo參數
//“日期和時間”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL TimeDate.cpl,,0’, SW_SHOWNORMAL);
//“時區”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL TimeDate.cpl,,1’, SW_SHOWNORMAL);
//滑鼠設定,沒有提供參數區別“按鈕”、“指標”和“移動”三個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Main.cpl’, SW_SHOWNORMAL);
//添加/刪除程式設定,可有ItemNo參數
//“安裝/卸載”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL AppWiz.cpl,,1’, SW_SHOWNORMAL);
//“Windows安裝程式”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL AppWiz.cpl,,2’, SW_SHOWNORMAL);
//“啟動盤”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL AppWiz.cpl,,3’, SW_SHOWNORMAL);
//網路設定,沒有提供參數區別“配置”、“標識”和“存取控制”三個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL NetCpl.cpl’, SW_SHOWNORMAL);
//系統設定,
//“常規”屬性頁面, 可有ItemNo參數
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL SysDm.cpl,,0’, SW_SHOWNORMAL);
//“裝置管理員”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL SysDm.cpl,,1’, SW_SHOWNORMAL);
//“硬體設定檔”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL SysDm.cpl,,2’, SW_SHOWNORMAL);
//“效能”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL SysDm.cpl,,3’, SW_SHOWNORMAL);
//顯示設定, 可有ItemNo參數
//“背景”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL desk.cpl,,0’, SW_SHOWNORMAL);
//“螢幕保護裝置程式”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL desk.cpl,,1’, SW_SHOWNORMAL);
//“外觀”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL desk.cpl,,2’, SW_SHOWNORMAL);
//“設定”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL desk.cpl,,3’, SW_SHOWNORMAL);
//遊戲控制器設定,可有ItemNo參數
//“一般”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Joy.cpl,,0’, SW_SHOWNORMAL);
//“進階”屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL Joy.cpl,,1’, SW_SHOWNORMAL);
//掃描器與數位相機設設定,沒有提供參數區分“裝置”和“記錄設定”兩個屬性頁面
WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL StiCpl.cpl’, SW_SHOWNORMAL);
以上程式在PWIN98+DELPHI3.0下調試通過.