Delphi 5.0 內建 CPL 專案範本,但 C++ Builder 同樣能輕鬆開發控制面板程式。CPL 本質是特殊的 DLL:副檔名為 .cpl,進入點為 CPlApplet() 而非 DllEntryPoint()(但仍需保留 DllEntryPoint 以通過編譯)。本文示範在 BCB 4.0 中從 DLL 專案轉製 CPL 的完整流程。
#include <vcl.h>
#include <cpl.h>
#include <cplext.h>
#pragma hdrstop
USERES("my.res"); // 包含圖示資源
extern "C" __declspec(dllexport) long CALLBACK __stdcall
CPlApplet(HWND hwndCPL, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) {
return 1; // 必須存在,否則無法編譯
}
long CALLBACK __declspec(dllexport) __stdcall
CPlApplet(HWND hwndCPL, UINT uMsg, LPARAM lParam1, LPARAM lParam2) {
LPNEWCPLINFO mycpl;
long result = 0;
switch (uMsg) {
case CPL_INIT: // 控制面板載入時首個訊息
result = 1; // 非零表示繼續載入
break;
case CPL_GETCOUNT: // 詢問程式圖示數量
result = 1; // 本例僅一個圖示
break;
case CPL_INQUIRE: // 舊版查詢介面(Win95 兼容)
result = 0;
break;
case CPL_NEWINQUIRE: // 新版查詢介面(Win95 OSR2+、NT 4.0+)
mycpl = (LPNEWCPLINFO)lParam2;
mycpl->dwSize = sizeof(NEWCPLINFO);
mycpl->dwFlags = 0;
mycpl->dwHelpContext = 0;
mycpl->lData = 0;
mycpl->hIcon = (HICON)LoadIcon(HInstance, "MyIcon"); // 從資源載入圖示
mycpl->szHelpFile[0] = '\0';
StrCopy(mycpl->szName, "BCB控制面板演示程式"); // 圖示下方文字
StrCopy(mycpl->szInfo, "用BCB開發自己的控制面板程式"); // 狀態列提示
result = 0;
break;
case CPL_DBLCLK: // 使用者雙擊圖示
ShowMessage("這是一個CPL試驗程式");
result = 0;
break;
case CPL_STOP: // 使用者關閉程式
result = 1;
break;
case CPL_EXIT: // 控制面板關閉,系統呼叫 FreeLibrary 卸載
result = 0;
break;
}
return result;
}
NEWCPLINFO 結構(圖示、名稱、說明、說明檔等),返回 0。一般僅需處理 CPL_NEWINQUIRE 與 CPL_DBLCLK,其他返回預設值即可。
CPL 基於 DLL 架構,在 CPL_DBLCLK 中建立並顯示 TForm 衍生類別實例,即可實現豐富的設定介面。方法與一般 DLL 中使用 VCL 視窗相同,需注意:
dll 改為 cpl。.cpl 檔複製到 Windows\System 目錄(或 System32),雙擊即可直接運行,無需開啟控制面板。使用 Image Editor 建立 .res 資源檔,包含名為 MyIcon 的圖示資源,專案中以 USERES("my.res") 引入。
my.cpl。C:\Windows\System(Win9x)或 C:\Windows\System32(NT 系列)。經驗證,此方法在 Win2000 SP2 + C++ Builder 6 環境下成功運行。掌握 CPL 開發,能為系統管理工具、硬體配置程式提供原生整合體驗。