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控制面板添加应用程序相关推荐
- WinCE桌面添加应用程序的快捷方式
将可执行程序MyApp.exe放入FAT分区KinglyFlash中,在桌面创建其快捷方式: (1) 创建KinglyApp.lnk 快捷方式文件 使用桌面Windows 自带的记事本创建,保存时将后 ...
- 隐藏添加删除程序中的程序在控制面板中的“添加/删除程序”项
隐藏添加删除程序中的程序在控制面板中的"添加/删除程序"项是我们要卸载程序一个程序最彻底的地方.但很多时候为了防止自己安装的程序不被别人卸载,我们希望能够在"添加/删除程 ...
- 隐藏/显示“添加删除程序”的软件
解决"添加删除程序"里面隐藏问题 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. http://11198908.blog ...
- WINCE6.0在控制面板添加控制面板应用程序
********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...
- WIN2000控制面板的添加删除程序不能正常运行时的修复
在WIN2000下,经常碰到由于系统文件未注册或丢失导致不能正常打开添加删除程序.按MS KB266668,可对其进行修复. 参考:http://support.microsoft.com/?kbid ...
- 在WINCE5.0开始菜单中添加应用程序
首先这篇文章主要参考http://blog.csdn.net/nanjianhui/archive/2009/07/01/4313044.aspx来写的,主要是想深入理解和自己实践一下. 在WinCE ...
- 控制面板的cpl程序列表
控制面板的cpl程序列表 学习了:https://zhidao.baidu.com/question/2141898537654796628.html 最近用来sysdm.cpl: 辅助功能选项:ac ...
- 大话WinCE与WinXP应用程序开发的差异性
//===================================================================== //TITLE: // 大话WinCE与WinXP ...
- 添加删除程序里面没有添加IIS服务的选项
用原版windows光盘安装,也可以网上下载IIS安装包. 1)1.控制面板里没有"->添加/删除Windows组件->Internet信息服务(IIS)"组件的添加方 ...
最新文章
- Java开发买低压本还是标压本_标压和低压,笔记本怎么选才最香?
- 7个小技巧,老板再也无法留我加班了...
- Java字符串处理技巧
- 量子计算时代快了!量子计算机的架构,硬件,软件等都有成果!
- 为什么都说猫有九条命呢
- 千万级负载均衡架构设计
- Yarn 监控 - 监控任务运行状态 (包括Spark,MR 所有在Yarn中运行的任务)
- win7让任务管理器pid显示出来的方法
- ViewPager 中添加监听
- like roofs shell white_高二英语新教材Unit 3同步练习
- 2022年最新《谷粒学院开发教程》:12 - 项目完结篇
- 会计新规给保险业带来的影响
- java标书_java软件项目投标技术标书【精选】.doc
- 银行账户管理体系总结
- java导入Excel中数据查重的方法
- HLS第三十八课(xfopencv,H文件和HPP文件的使用)
- 一、如何快速掌握数据库
- 用python进行数据分析:杂乱字符串的处理
- av_rescale_q()
- 简单的CMD命令-进入到某个文件夹
热门文章
- IDEA中如何新建一个带有-P目录的项目
- vue登录如何存储cookie_vue保持用户登录状态(各种token存储方式)
- python定义函数需要保留字def_定义函数时要用到哪一个python保留字?_学小易找答案...
- 【离散数学中的数据结构与算法】五 排列与组合一
- 【C语言进阶深度学习记录】三十 二维数组与二维指针
- windows 下cmd命令行的替换工具cmder
- Spring Security在标准登录表单中添加一个额外的字段
- Wireshark抓包常见问题解析(转)
- Linux 普通用户拿到root权限及使用szrz命令上传下载文件
- spring源码分析2本最高清带书目PDF百度网盘分享