應用程式運行時,有時需要對系統環境有特殊要求。例如,在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等。透過呼叫這些檔案可以開啟對應的屬性設定窗口,甚至可以跳到對應的屬性頁如「網路」屬性的「連線」屬性頁,有效減少軟體使用者的操作步驟。
CPL檔案的呼叫格式為「RunDLL32.exe Shell32.dll,Control_RunDLL CPLFile.cpl,,ItemNo」(可參考登錄中HKEY_CLASSES_ROOTcplfileshellcplopencommand的預設值),其中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下調試通過.