首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Borland C++ Builder 開發控制面板程序 (CPL) 完整實戰

     編輯:VC 教學

CPL 程序本質

控制面板程序 (.cpl) 是動態鏈接庫 (DLL) 的特殊形式:

  • 副檔名為 .cpl (而非 .dll)
  • 導出入口函數 CPlApplet (而非 DllEntryPoint)
  • 仍需 DllEntryPoint 以便編譯鏈接
  • 系統通過 LoadLibrary 載入,調用 CPlApplet 處理消息

BCB 開發步驟

  1. File → New → DLL 創建項目
  2. 添加 CPlApplet 導出函數
  3. 編譯輸出 .dll,重命名為 .cpl
  4. 複製到 C:\Windows\System32\ 即可在控制面板顯示

最小化 CPL 示例代碼

#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;
}

資源文件準備 (my.rc)

// 圖標資源
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

CPL 消息流程詳解

  1. CPL_INIT:控制面板啟動時發送,執行一次性初始化,返回 0 表示失敗將不再載入
  2. CPL_GETCOUNT:緊隨其後,返回該 CPL 包含的圖標/小程序數量
  3. CPL_NEWINQUIRE:為每個圖標 (索引 0 到 count-1) 發送一次,填充 NEWCPLINFO 結構
  4. CPL_DBLCLK:用戶雙擊圖標時發送,lParam1 為圖標索引,執行核心功能
  5. CPL_STOP:用戶關閉小程序窗口時發送,執行清理
  6. CPL_EXIT:控制面板關閉前發送,執行全局清理,系統隨後 FreeLibrary

NEWCPLINFO 結構關鍵字段

字段類型用途
dwSizeDWORD結構大小,必須設置
dwFlagsDWORD標志位,通常為 0
dwHelpContextDWORD幫助上下文 ID
lDataLONG自定義數據,傳遞給 CPL_DBLCLK
hIconHICON圖標句柄 (32x32 建議)
szNamechar[32]圖標下顯示名稱
szInfochar[64]狀態欄提示信息
szHelpFilechar[128]幫助文件路徑

進階功能擴展

  • 多圖標支持:CPL_GETCOUNT 返回 N,CPL_NEWINQUIRE 根據 lParam1 索引填充不同信息
  • 右鍵菜單:處理 CPL_SELECT/CPL_DBLCLK 組合實現上下文菜單
  • 幫助系統:設置 szHelpFile 和 dwHelpContext,配合 WinHelp/HTML Help
  • 狀態持久化:使用注冊表 HKCU\Software\YourCPL 保存用戶設置
  • 管理員權限檢測:CPL_DBLCLK 中調用 IsUserAnAdmin() 提示重啟

調試技巧

  1. 輸出調試信息到文件或 OutputDebugString (DebugView 查看)
  2. 命令行直接測試:rundll32.exe shell32.dll,Control_RunDLL your.cpl
  3. 附加進程調試:BCB IDE → Run → Attach to Process → 選擇 explorer.exe 或 rundll32.exe

部署注意事項

  • 目標機需安裝對應版本 VCL 運行庫 (或編譯為獨立無依賴)
  • 簽名數字簽名避免殺毒軟件誤報
  • 支持 32/64 位:分別編譯 MyCPL32.cpl 和 MyCPL64.cpl,或使用通用安裝腳本
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved