当前位置:首页 > 芯闻号 > 充电吧
[导读]作者:ARM-WinCEWinCE 系统中的控制面板和 Windows 系统中的控制面板原理是一样的,里面就是包含了一些应用程序。 WinCE 系统的控制面板由 Ctlpnl.exe , Contro

作者:ARM-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

#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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在电力电子和实验室设备中,可调电源是一种非常常见的设备,它能够根据用户需求提供稳定且可调的输出电压和电流。在可调电源的控制面板上,通常会有一系列的按钮和旋钮,用于设置和调整电源的参数。其中,“VOL”按钮是一个重要的控制...

关键字: 电力电子 可调电源 控制面板

(全球TMT2022年8月2日讯)日前,亚马逊云科技宣布完全托管的广域网(WAN)服务Amazon Cloud WAN正式可用,通过连接企业本地数据中心、托管主机设施、分支机构和云资源来简化企业全球网络运维。企业通过A...

关键字: 亚马逊 AN 控制面板 SD

摘 要:启动装载程序是嵌入式系统的重要组成部分。文章结合在ARM平台上广泛使用的U-Boot,详细讨论了Boot Loader开发中用到的主要技术,分析引导程序的执行流程,提出了WinCE和Linux在ARM平台下...

关键字: 启动装载程序 U-Boot 嵌入式系统 WinCE Linux

摘 要:火车货运在高速发展的同时,也带来了越来越多的不安全因素,货运物资被盗是铁路货运事故的主要原因之一。 基于此,设计和实现了基于ZigBee和WinCE技术的火车货运防盗预警系统,用于解决站停、待编、待卸和运行途中...

关键字: 火车货运 智能防盗 Zigbee WinCE PDA软件

Silicon Labs的Sub-GHz和Zigbee无线解决方案支持连接多达500个Sub-G节点,实现更广阔的智能家居覆盖范围。

关键字: AI 智能家居 控制面板

SiliconLabs(亦称“芯科科技”)日前宣布与JohnsonControls公司合作开发基于Z-Wave700平台的下一代Qolsys智能家居控制面板。JohnsonControls为全球智能、健康和可持续性建筑解...

关键字: Johnson 控制面板 智能家居控制

电源大家都知道,为我们的社会的发展,贡献了很大的能量,现有的所有的电子产品都离不开电源,那么你知道电源管理吗?伴随着移动嵌入式产品的普及,电源管理已经成为重要技术指标和产品的有机组成。典型移动嵌入式设备对能耗越来越敏感,...

关键字: 电源管理 WinCE 有机组成

  车载操作系统(AutomoTIve OperaTIng System,简称AOS)是管理和控制车载硬件与车载软件资源的程序系统,是直接运行在AB上的最基本的系统软件,任何上层软件,HMI,数

关键字: iOS Linux WinCE

贵公司是否在维护数据采集与监视控制(SCADA)系统,来为客户提供更高效的服务,或者希望通过公司设置基于云的远程监控解决方案来节省资金?如果是这样,您可能会受益于工业物联网(IIOT)。原始设备

关键字: 工业物联网 远程监控系统 控制面板 数据收集

(文章来源:5G智玩好物) 为了健康和方便饮水,不少人有用桶装水的习惯,但是一桶接近20kg的重量往往会让很多女生束手无策。在生活越来越讲究的今天,便捷的直饮方式会给更多人带来更有品质的

关键字: 噪音 指示灯 控制面板 电机
关闭
关闭