WinCE控制面板添加应用程序
WinCE系統中的控制面板和Windows系統中的控制面板原理是一樣的,里面就是包含了一些應用程序。WinCE系統的控制面板由Ctlpnl.exe,Control.exe和一些.cpl文件組成,其中Ctlpnl.exe和Control.exe用于控制控制面板的文件夾顯示和架構,而.cpl文件和控制面板中的實際應用程序相對應。
?
WinCE的控制面板中的每個應用程序都由兩部分組成:應用程序本身和所對應的.cpl文件。實際上.cpl文件就是一個dll,在該dll中會導出CPLApplet函數,該函數會處理來自控制面板的消息(CPL_INIT, CPL_DBCLK, CPL_STOP等),然后根據相應的消息來調用應用程序。
?
先來看一下CPlApplet函數,如下:
LONG CPlApplet(HWND hwndCPl, UINT msg, LPARAM lParam1, LPARAM lParam2)
hwndCPl:控制面板窗口的句柄
msg:發給控制面應用程序的消息
lParam1:消息參數1
lParam2:消息參數2
?
該函數會根據msg參數傳入的消息進行相應的處理,WinCE中所支持的控制面板消息如下:
CPL_INIT:被首次加載的時候會收到該消息,也是第一個消息,用于初始化控制面板應用程序,比如內存分配等。
CPL_GETCOUNT:第二個被收到的消息,該消息用于獲得該控制面板應用程序中的組件數,因為.cpl文件中可能包含多個Applet程序。
CPL_NEWINQUIRE:查詢組件信息,如果該.cpl中包含多個組件,那么lParam1表示組件號,lParam2是一個指向NEWCPLINFO結構的指針,其中NEWCPLINFO結構用于描述組件信息。
CPL_DBCLK:用戶在控制面板界面中雙擊某個應用時,會收到該消息,在該消息中執行對應的應用程序。如果包含多個組件,那么lParam1表示組建號,lParam2為傳給應用程序的數據。
CPL_STOP:關閉控制面應用程序時,收到該消息,用于釋放資源。如果包含多個組件,那么lParam1表示組件號,lParam2為傳給應用程序的數據。
CPL_EXIT:在CPL_STOP消息之后,控制面板釋放該應用程序時,收到該消息。
?
在CPlApplet中收到CPL_NEWINQUIRE消息時,會初始化NEWCPLINFO結構來描述組件信息,該結構定義如下:
typedef struct tagNEWCPLINFO {
? DWORD dwSize;
? DWORD dwFlags;
? DWORD dwHelpContext;
? LONG lData;
? HICON hIcon;
? TCHAR szName[32];
? TCHAR szInfo[64];
? TCHAR szHelpFile[128];
} NEWCPLINFO;
?
dwSize:該結構的信息
dwFlags:忽略
dwHelpContext:忽略
lData:傳給組建程序的數據
hIcon:顯示在控制面板中的圖標的句柄
szName:顯示在控制面板中的組件的名字
szInfo:顯示在控制面板中的描述信息
szHelpFile:忽略
?
?
前面介紹了控制面板的基礎知識,下面就開始添加應用程序到WinCE控制面板中,步驟如下:
1. 創建一個WinCE的工程,然后添加一個應用程序:
首先要有一個WinCE的工程,然后點擊File->New->Subproject,然后選擇WCE Application,然后可以選擇Hello World應用程序。
?
2. 為應用程序創建CPL工程:
同樣點擊File->New->Subproject,然后選擇WCE Dynamic-Link Library,工程名為HelloCPL,然后點擊Next,在Auto-generated subproject files頁面中選擇A Dll that exports some symbols,然后點擊Finish完成。
?
3. 添加CPlApplet函數:
打開HelloCPL工程,并打開HelloCPL.cpp文件,添加如下頭文件:
#include <tchar.h>
#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("\\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的時候,加載了IDI_HELLO,IDS_APP_TITLE和IDC_Hello三個資源,分別是一個圖標和兩個字符串。為工程添加rc資源文件和resource.h頭文件,導入圖標資源和字符串資源。資源的導入和定義比較簡單,所以不介紹具體步驟了。
?
4. 修改HelloCPL工程配置:
打開HelloCPL.bib文件,添加如下內容:
MODULES
HelloCPL.cpl? $(_FLATRELEASEDIR)\HelloCPL.cpl?????????????? NK
?
右擊HelloCPL工程,選擇Properities,選擇General頁面,在Custom Variables項中添加變量,變量名字為CPL,值為1。
?
再次右擊HelloCPL工程,選擇Properities,選擇C/C++頁面,確認Additional Macro Definitions的值為$(CDEFINES) -DHelloCPL_EXPORTS。設置DLL Entry Point項為DllMain。在Include Directories項中添加路徑$(_PROJECTROOT)\cesysgen\oak\inc。
?
5. 編譯Hello應用程序和HelloCPL工程:
編譯開始創建的Hello應用程序和HelloCPL工程,在WinCE6.0中,編譯完成后會自動Makeimg操作。
?
?
通過上面的步驟,可以把應用程序添加到WinCE系統的控制面板中,最后編譯成功以后,就可以下載運行了,在此我添加了一個Hello的應用程序,名字叫Hello application,運行結果如圖:
?
總結
以上是生活随笔為你收集整理的WinCE控制面板添加应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品对比:南方零钱佳和建信闲钱佳的区别
- 下一篇: 招行信用卡预借现金怎么办理/开通