控制面板程序 (.cpl) 是動態鏈接庫 (DLL) 的特殊形式:
.cpl (而非 .dll)CPlApplet (而非 DllEntryPoint)DllEntryPoint 以便編譯鏈接LoadLibrary 載入,調用 CPlApplet 處理消息CPlApplet 導出函數C:\Windows\System32\ 即可在控制面板顯示#include
#include
#include
#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 pInfo;
long result = 0;
switch (uMsg) {
case CPL_INIT: // 控制面板載入時
result = 1; // 返回非零表示成功
break;
case CPL_GETCOUNT: // 返回圖標數量
result = 1; // 本例僅一個圖標
break;
case CPL_INQUIRE: // 老版本查詢 (已棄用)
result = 0;
break;
case CPL_NEWINQUIRE: // 新版本查詢 (Win95+)
pInfo = (LPNEWCPLINFO)lParam2;
pInfo->dwSize = sizeof(NEWCPLINFO);
pInfo->dwFlags = 0;
pInfo->dwHelpContext = 0;
pInfo->lData = 0;
pInfo->hIcon = (HICON)LoadIcon(HInstance, "MyIcon"); // 從資源加載圖標
pInfo->szHelpFile[0] = '\0';
StrCopy(pInfo->szName, "BCB控制面板演示程序"); // 圖標下顯示名稱
StrCopy(pInfo->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;
}
// 圖標資源
MyIcon ICON "myicon.ico"
// 可選:版本信息
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK 0x3fL
FILEFLAGS 0
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", "My Company"
VALUE "FileDescription", "Custom Control Panel Applet"
VALUE "FileVersion", "1.0.0.0"
VALUE "InternalName", "MyCPL"
VALUE "OriginalFilename", "MyCPL.CPL"
VALUE "ProductName", "My CPL Suite"
VALUE "ProductVersion", "1.0.0.0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 0x4E4
END
END
lParam1 為圖標索引,執行核心功能FreeLibrary| 字段 | 類型 | 用途 |
|---|---|---|
| dwSize | DWORD | 結構大小,必須設置 |
| dwFlags | DWORD | 標志位,通常為 0 |
| dwHelpContext | DWORD | 幫助上下文 ID |
| lData | LONG | 自定義數據,傳遞給 CPL_DBLCLK |
| hIcon | HICON | 圖標句柄 (32x32 建議) |
| szName | char[32] | 圖標下顯示名稱 |
| szInfo | char[64] | 狀態欄提示信息 |
| szHelpFile | char[128] | 幫助文件路徑 |
CPL_GETCOUNT 返回 N,CPL_NEWINQUIRE 根據 lParam1 索引填充不同信息CPL_SELECT/CPL_DBLCLK 組合實現上下文菜單szHelpFile 和 dwHelpContext,配合 WinHelp/HTML HelpHKCU\Software\YourCPL 保存用戶設置CPL_DBLCLK 中調用 IsUserAnAdmin() 提示重啟OutputDebugString (DebugView 查看)rundll32.exe shell32.dll,Control_RunDLL your.cplMyCPL32.cpl 和 MyCPL64.cpl,或使用通用安裝腳本