WinCE控制面板添加應(yīng)用程序
作者:ARM-WinCE
WinCE
系統(tǒng)中的控制面板和
Windows
系統(tǒng)中的控制面板原理是一樣的,里面就是包含了一些應(yīng)用程序。
WinCE
系統(tǒng)的控制面板由
Ctlpnl.exe
,
Control.exe
和一些
.cpl
文件組成,其中
Ctlpnl.exe
和
Control.exe
用于控制控制面板的文件夾顯示和架構(gòu),而
.cpl
文件和控制面板中的實(shí)際應(yīng)用程序相對(duì)應(yīng)。
?
WinCE 的控制面板中的每個(gè)應(yīng)用程序都由兩部分組成:應(yīng)用程序本身和所對(duì)應(yīng)的 .cpl 文件。實(shí)際上 .cpl 文件就是一個(gè) dll ,在該 dll 中會(huì)導(dǎo)出 CPLApplet 函數(shù),該函數(shù)會(huì)處理來(lái)自控制面板的消息 (CPL_INIT, CPL_DBCLK, CPL_STOP 等 ) ,然后根據(jù)相應(yīng)的消息來(lái)調(diào)用應(yīng)用程序。
?
先來(lái)看一下 CPlApplet 函數(shù),如下:
LONG CPlApplet(HWND hwndCPl, UINT msg, LPARAM lParam1, LPARAM lParam2)
hwndCPl :控制面板窗口的句柄
msg :發(fā)給控制面應(yīng)用程序的消息
lParam1 :消息參數(shù) 1
lParam2 :消息參數(shù) 2
?
該函數(shù)會(huì)根據(jù) msg 參數(shù)傳入的消息進(jìn)行相應(yīng)的處理, WinCE 中所支持的控制面板消息如下:
CPL_INIT : 被首次加載的時(shí)候會(huì)收到該消息,也是第一個(gè)消息,用于初始化控制面板應(yīng)用程序,比如內(nèi)存分配等。
CPL_GETCOUNT :第二個(gè)被收到的消息,該消息用于獲得該控制面板應(yīng)用程序中的組件數(shù),因?yàn)?.cpl 文件中可能包含多個(gè) Applet 程序。
CPL_NEWINQUIRE :查詢組件信息,如果該 .cpl 中包含多個(gè)組件,那么 lParam1 表示組件號(hào), lParam2 是一個(gè)指向 NEWCPLINFO 結(jié)構(gòu)的指針,其中 NEWCPLINFO 結(jié)構(gòu)用于描述組件信息。
CPL_DBCLK :用戶在控制面板界面中雙擊某個(gè)應(yīng)用時(shí),會(huì)收到該消息,在該消息中執(zhí)行對(duì)應(yīng)的應(yīng)用程序。如果包含多個(gè)組件,那么 lParam1 表示組建號(hào), lParam2 為傳給應(yīng)用程序的數(shù)據(jù)。
CPL_STOP :關(guān)閉控制面應(yīng)用程序時(shí),收到該消息,用于釋放資源。如果包含多個(gè)組件,那么 lParam1 表示組件號(hào), lParam2 為傳給應(yīng)用程序的數(shù)據(jù)。
CPL_EXIT :在 CPL_STOP 消息之后,控制面板釋放該應(yīng)用程序時(shí),收到該消息。
?
在 CPlApplet 中收到 CPL_NEWINQUIRE 消息時(shí),會(huì)初始化 NEWCPLINFO 結(jié)構(gòu)來(lái)描述組件信息,該結(jié)構(gòu)定義如下:
typedef struct tagNEWCPLINFO {
? DWORD dwSize;
? DWORD dwFlags;
? DWORD dwHelpContext;
? LONG lData;
? HICON hIcon;
? TCHAR szName[32];
? TCHAR szInfo[64];
? TCHAR szHelpFile[128];
} NEWCPLINFO;
?
dwSize :該結(jié)構(gòu)的信息
dwFlags :忽略
dwHelpContext :忽略
lData :傳給組建程序的數(shù)據(jù)
hIcon :顯示在控制面板中的圖標(biāo)的句柄
szName :顯示在控制面板中的組件的名字
szInfo :顯示在控制面板中的描述信息
szHelpFile :忽略
?
?
前面介紹了控制面板的基礎(chǔ)知識(shí),下面就開始添加應(yīng)用程序到 WinCE 控制面板中,步驟如下:
1. 創(chuàng)建一個(gè) WinCE 的工程,然后添加一個(gè)應(yīng)用程序:
首先要有一個(gè) WinCE 的工程,然后點(diǎn)擊 File->New->Subproject ,然后選擇 WCE Application ,然后可以選擇 Hello World 應(yīng)用程序。
?
2. 為應(yīng)用程序創(chuàng)建 CPL 工程:
同樣點(diǎn)擊 File->New->Subproject ,然后選擇 WCE Dynamic-Link Library ,工程名為 HelloCPL ,然后點(diǎn)擊 Next ,在 Auto-generated subproject files 頁(yè)面中選擇 A Dll that exports some symbols ,然后點(diǎn)擊 Finish 完成。
?
3. 添加 CPlApplet 函數(shù):
打開 HelloCPL 工程,并打開 HelloCPL.cpp 文件,添加如下頭文件:
#include
#include “cpl.h”
?
然后添加如下代碼:
#define lengthof(exp) ((sizeof((exp)))/sizeof((*(exp))))
?
HMODULE g_hModule = NULL;?? // Handle to the DLL.
?
?
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD? ul_reason_for_call,
LPVOID lpReserved
)
{
??? switch (ul_reason_for_call)
??? {
??????? case DLL_PROCESS_ATTACH:
??????????????????????? {
??????????????????????????????????? g_hModule = (HMODULE) hModule;
??????????????????????? }
??????? case DLL_THREAD_ATTACH:
??????? case DLL_THREAD_DETACH:
??????? case DLL_PROCESS_DETACH:
???? ??????? break;
??? }
??? return TRUE;
}
?
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// The entry point to the Control Panel application.
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
extern "C" HelloCPL_API LONG CALLBACK CPlApplet(HWND hwndCPL,
????????????????? UINT message, LPARAM lParam1, LPARAM lParam2)
{
? switch (message)
? {
??? case CPL_INIT:
????? // Perform global initializations, especially memory
????? // allocations, here.
????? // Return 1 for success or 0 for failure.
????? // Control Panel does not load if failure is returned.
????? return 1;
?
??? case CPL_GETCOUNT:
????? // The number of actions supported by this Control
????? // Panel application.
????? return 1;
?
??? case CPL_NEWINQUIRE:
????? // This message is sent once for each dialog box, as
????? // determined by the value returned from CPL_GETCOUNT.
????? // lParam1 is the 0-based index of the dialog box.
????? // lParam2 is a pointer to the NEWCPLINFO structure.
??? {
????? ASSERT(0 == lParam1);
????? ASSERT(lParam2);
?
????? NEWCPLINFO* lpNewCplInfo = (NEWCPLINFO *) lParam2;
????? if (lpNewCplInfo)
????? {
???????? lpNewCplInfo->dwSize = sizeof(NEWCPLINFO);
???????? lpNewCplInfo->dwFlags = 0;
???????? lpNewCplInfo->dwHelpContext = 0;
???????? lpNewCplInfo->lData = IDI_HELLO;
?
???????? // The large icon for this application. Do not free this
???????? // HICON; it is freed by the Control Panel infrastructure.
???????? lpNewCplInfo->hIcon = LoadIcon(g_hModule,
????????????????????????????????? MAKEINTRESOURCE(IDI_HELLO));
?
????????? LoadString(g_hModule, IDS_APP_TITLE, lpNewCplInfo->szName,
???????????????????? lengthof(lpNewCplInfo->szName));
????????? LoadString(g_hModule, IDC_Hello, lpNewCplInfo->szInfo,
???????????????????? lengthof(lpNewCplInfo->szInfo));
????????? _tcscpy(lpNewCplInfo->szHelpFile, _T(""));
????????? return 0;
????? }
????? return 1;? // Nonzero value means CPlApplet failed.
??? }
?
??? case CPL_DBLCLK:
??? {
????? // The user has double-clicked the icon for the
????? // dialog box in lParam1 (zero-based).
????? PROCESS_INFORMATION pi = {0};
????? if (CreateProcess(_T("http://Windows//Hello.exe"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi))
????? {
??????? CloseHandle(pi.hThread);
??????? CloseHandle(pi.hProcess);
??????? return 0;
????? }
????? return 1;???? // CPlApplet failed.
??? }
?
??? case CPL_STOP:
????? // Called once for each dialog box. Used for cleanup.
??? case CPL_EXIT:
????? // Called only once for the application. Used for cleanup.
??? default:
????? return 0;
? }
?
? return 1;? // CPlApplet failed.
}? // CPlApplet
?
?
具體不做解釋了,相信自己看一下都能看明白。在上面的代碼中,處理消息 CPL_NEWINQUIRE 的時(shí)候,加載了 IDI_HELLO , IDS_APP_TITLE 和 IDC_Hello 三個(gè)資源,分別是一個(gè)圖標(biāo)和兩個(gè)字符串。為工程添加 rc 資源文件和 resource.h 頭文件,導(dǎo)入圖標(biāo)資源和字符串資源。資源的導(dǎo)入和定義比較簡(jiǎn)單,所以不介紹具體步驟了。
?
4. 修改 HelloCPL 工程配置:
打開 HelloCPL.bib 文件,添加如下內(nèi)容:
MODULES
HelloCPL.cpl? $(_FLATRELEASEDIR)/HelloCPL.cpl?????????????? NK
?
右擊 HelloCPL 工程,選擇 Properities ,選擇 General 頁(yè)面,在 Custom Variables 項(xiàng)中添加變量,變量名字為 CPL ,值為 1 。
?
再次右擊 HelloCPL 工程,選擇 Properities ,選擇 C/C++ 頁(yè)面,確認(rèn) Additional Macro Definitions 的值為 $(CDEFINES) -DHelloCPL_EXPORTS 。設(shè)置 DLL Entry Point 項(xiàng)為 DllMain 。在 Include Directories 項(xiàng)中添加路徑 $(_PROJECTROOT)/cesysgen/oak/inc 。
?
5. 編譯 Hello 應(yīng)用程序和 HelloCPL 工程:
編譯開始創(chuàng)建的 Hello 應(yīng)用程序和 HelloCPL 工程,在 WinCE6.0 中,編譯完成后會(huì)自動(dòng) Makeimg 操作。
?
?
通過(guò)上面的步驟,可以把應(yīng)用程序添加到 WinCE 系統(tǒng)的控制面板中,最后編譯成功以后,就可以下載運(yùn)行了,在此我添加了一個(gè) Hello 的應(yīng)用程序,名字叫 Hello application