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控制面板添加应用程序 - lim - lim的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 游标 904,如何解决Oracle数据库游标连接超出问题

如何解决Oracle数据库游标连接超出问题发布时间&#xff1a;2020-07-21 10:57:35来源&#xff1a;亿速云阅读&#xff1a;103作者&#xff1a;小猪这篇文章主要讲解了如何解决Oracle数据库游标连接超出问题&#xff0c;内容清晰明了&#xff0c;对此有兴趣的小伙伴可以学习一下…

用多媒体库 Bass.dll 播放 mp3 [15] - 设置与获取播放速度

本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 class(TForm)OpenDialog1: TOpenDialog;Button1: TButton;Button2: TButton;Button3: TButton;TrackBar1:…

【转】Dicom文件解析!!!!!!

转自&#xff1a;https://blog.csdn.net/leaf6094189/article/details/8510325 Dicom全称是医学数字图像与通讯&#xff0c;这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取&#xff0c;读取本身是没啥难度的 无非就是字节码数据流处理。只不过确实比较…

VS2008 JS脚本调试总是调试旧代码 真不知道怎么回事?谁能帮帮我呀!

如图,[dynamic]标记的是调试的元文件 xml1.htm[dynamic]和xml.js[dynamic] 我更改后的文件是xml1.htm和xml.js,见图1 2 调试的文件有debugger 更改后的文件我把debugger注了 js脚本中我把变量给改了见3 4 ,所以在浏览新的xml1.htm时,竟然报对象找不到,真实受不了了!!! 为什么我…

【转】C#开发PACS医学影像处理系统(一):开发背景和功能预览

转自&#xff1a;https://www.cnblogs.com/Uncle-Joker/p/13646949.html 本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统&#xff0c; 国内相关资料比较少&#xff0c;也借此机会丰富一下医学软件开发生态&#xff0c;讨论技术难点&#xff0c;希望…

《WF编程》系列之30 - 基本活动:错误处理

《WF编程》系列之30 - 基本活动:错误处理 4.3 错误处理 Fault,故障,现在官方已经将其翻译为错误,那么以后的随笔中我也就采用官方的翻译吧. 错误处理也属于流程控制的一部分,这一节我来介绍一下有关错误处理的活动.错误是指在工作流执行期间发生的异常.我们可以使用错误处理程…

oracle错误27101,ORA-27101ORA-01034错误解决

Oracle已经启动&#xff0c;连接sqlplus后&#xff0c;进行查询&#xff0c;出现下面错误ORA-01034: ORACLE not availableORA-27101: shared memory realm doesOracle已经启动&#xff0c;连接sqlplus后&#xff0c;进行查询&#xff0c;出现下面错误ORA-01034: ORACLE not av…

NOD32升级ID获取器For流星无语更新了

NOD32升级ID获取器For流星无语更新了一下,现在可以直接把用户名密码写入注册表了,连复制/粘贴操作都可以免了...转载于:https://www.cnblogs.com/lxwy/archive/2008/09/05/4420722.html

【转】【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件

转自&#xff1a;https://developer.aliyun.com/article/672065 最近研究了一下DICOM和BMP文件转换的问题&#xff0c;也是很头大。度娘了很久&#xff0c;也在CSDN等论坛看到一些断断续续的文件&#xff0c;最主要的是代码只是片断&#xff0c;不是完整的实现。头大了。 首先…

C++设计模式之二 AbstractFactory模式

设计模式的目的就是尽量减少“变化”对程序的影响&#xff0c;尤其是对客户程序的影响。AbstractFactory模式作为创建型模式的一种&#xff0c;解决的就是“new”在变化中可能引起的问题。 先来看看new有何种不好&#xff0c;举个创建汽车的车门的例子&#xff1a; 很自然的一…

改写DataCogs在MOSS列表中实现三级联动字段

项目中有需求需要实现列表中3级的字段联动。参照小熊的[分享]修复DataCogs二级联动FieldControl支持中文 &#xff0c;改造一下&#xff0c;实现了3级联动字段。另外&#xff0c;还可以实现一个列表中同时有两个&#xff0c;或两个以上互相独立的联动字段&#xff0c; 详细的字…

【转】01.Dicom 学习笔记-DICOM C-Store 消息服务

转自&#xff1a;https://www.jianshu.com/p/bab6a85d3486 引言 之前总体介绍了 DICOM 的消息服务&#xff0c;可以参考这篇博文&#xff0c;但是有关每个服务的详细信息没有讲解&#xff0c;本文就结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Store 服务。 名词简介 在正式讲…

【转】02.Dicom 学习笔记-DICOM C-Find 消息服务

引言 前篇介绍了 DICOM C-Store 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Find 服务。 C-Find 消息服务 C-Find 服务是一个查询服务&#xff0c;用于一个 DIMSE-service-user 在同等的DIMSE-service-user 上查询复合 SOP 实例的属性满足查询条件给出…

【转】03.Dicom 学习笔记-DICOM C-Get 消息服务

转自&#xff1a;https://www.jianshu.com/p/c7f5b9fa597c 引言 前篇介绍了 DICOM C-Find 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Get 服务。 C-Get 消息服务 C-Get 服务主要用于获取影像&#xff0c;用于一个 DIMSE-service-user 在同等的DIMSE…

php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...

关于DAO数据访问对象设计其实是关于GoFrame框架工程化实践中比较重要一块设计。DAO设计结合GoFrame的ORM组件性能和易用性都很强&#xff0c;可以极大提高开发和维护效率。看完本章节内容之后&#xff0c;小伙伴们应该能够理解并体会到使用DAO数据库访问对象设计的优点。一、现…

再谈“我是怎么招聘程序员的”

我以前写过一篇“我是怎么招聘程序员的”的文章&#xff08;在CSDN那里有很多人进行了回复&#xff09;。今天&#xff0c;我想再谈谈关于招聘和面试这方面的东西&#xff0c;主要是以下这些原因&#xff1a; 近半年来我在进行了大量的招聘工作&#xff0c;对面试有一些新的体…

【转】04.Dicom 学习笔记-DICOM C-Move 消息服务

引言 前篇介绍了 DICOM C-Get 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Move 服务。 C-Move 消息服务 C-Move 服务可以用来获取影像和转存影像&#xff0c;用于一个 DIMSE-service-user 在同等的 DIMSE-service-user 上查询复合 SOP 实例的属性满足…

【转】05.Dicom 学习笔记-DICOM C-Echo 消息服务

引言 经过前面几篇的介绍&#xff0c;DIMSE-C 消息服务这块已经讲解了差不多了&#xff0c;还剩最后一个 C-Echo 消息服务&#xff0c;这个服务相对前面的4个服务来说更简单一些&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Echo 服务。 C-Echo 消息服务 首先来…

哪些设计模式最值得学习

最近又在首页看到几篇设计模式相关的学习随笔。回想起来&#xff0c;这几年在园子里发布的有关设计模式的随笔都有一个共同的特点。那就是Factory和Singleton居多&#xff0c;如果是系列的&#xff0c;也往往是从这两个模式开始的。由于能够坚持把《设计模式》中所有模式都写完…

【转】000.DICOM:DICOM标准学习路线图(初稿)!!!!!!!!!!!!

转自&#xff1a;https://zssure.blog.csdn.net/article/details/49231303 题记&#xff1a; DICOM医学图像处理专栏撰写已有两个年头&#xff0c;积累了近百篇文章。 起初 只是用于记录自己科研、工作中遇到的疑难问题&#xff0c;专注于图像处理&#xff08;主要是医学图像…