控制面板编程.docx_第1页
控制面板编程.docx_第2页
控制面板编程.docx_第3页
控制面板编程.docx_第4页
控制面板编程.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

oskycar转 cpl文件控制面板编程控制面板,你了解多少。当你安装了一些应用程序后,是否感觉到你的控制面板增加了一些组件,如安装了Borland C+ Builder后,“BDE Administrator”就会进入你的控制面板,安装了QuickTime还会增加“QuickTime”组件,这些现象说明了什么,我想它只是说明了一个事实:“控制面板”是可以操纵的,你也可以控制你的控制面板,它并无什么神秘可言,哪到底如何操纵呢,这正是我今天要讨论的主题,在这里我将会带领大家有浅入深地来探讨“控制面板”这个鲜为人知的主题。我主要分3个部分来阐述:(由于文章大小的限制,我决定将其分成两章来介绍)1、控制面板是什么,它在哪里?2、CPL文件的真实身份3、VCL如何提供对“控制面板”的支持控制面板是什么,它在哪里?控制面板是什么,它在哪儿?以前,我也很困惑,只是偶尔从一些关于“Windows系统管理”的书籍朦胧地听到关于“控制面板”的描述:“控制面板的每一项一般都会对应一个.CPL 文件,这些文件存于系统目录下,你可以指定控制面板中要显示的项目,也可以隐藏等等”关于如何实现,可能还会教给你一些通过修改注册表来达到目的,是的,这可以达到目的,但我想这只是从一个管理者地角度来看待这个问题的,如果从程序员的角度又如何的,他们的描述能解决你的问题吗?你如何利用程序来达到控制你”控制面板”的目的,你想知道吗,请听下文分解.CPL文件的真实身份上面提到了以“.CPL”扩展名结尾文件”,既然又与控制面板有关,哪我就来分析一下CPL文件到底是什么吧,随便找一些CPL文件,如:main.cpl,access.cpl等,我用Dumpbin测试结果如下:C:WINDOWSsystem32dumpbin main.cplMicrosoft (R) COFF Binary File Dumper Version 6.00.8168Copyright (C) Microsoft Corp 1992-1998. All rights reserved.Dump of file main.cplFile Type: DLL(由DLL可以知道它是一个DLL文件)C:WINDOWSsystem32dumpbin /exports appwiz .cplMicrosoft (R) COFF Binary File Dumper Version 6.00.8168Copyright (C) Microsoft Corp 1992-1998. All rights reserved.Dump of file appwiz.cplFile Type: DLLSection contains the following exports for appwiz.dllordinal hint RVA name1 0 00017926 CPlApplet2 1 00017F05 ConfigStartMenuC:WINDOWSsystem32dumpbin /exports access.cplMicrosoft (R) COFF Binary File Dumper Version 6.00.8168Copyright (C) Microsoft Corp 1992-1998. All rights reserved.Dump of file access.cplFile Type: DLLSection contains the following exports for Access.dllordinal hint RVA name1 0 00004B41 CPlApplet2 1 00004B33 DebugMain3 2 00004B30 DllRegisterServer3 3 00004A27 DllUnregisterServer从上面的测试结果你看到了什么,我认为至少有两点:1、 CPL文件就是一个DLL文件2、 CPL文件都导出了一个CPLApplet函数这两点揭开了控制面板程序的神秘面纱,你不会再对控制面板程序是什么感到疑惑了,其实,控制面板程序就是一个须导出CPLApplet函数的DLL文件,只是挂上了CPL的后缀名而已。既然都要导出CPLApplet函数,可以想象CPLApplet这个函数的重要性,其实,不光是控制面板,只要是想加载CPL文件的其他所有应用程序都必须取得CPLApplet函数的地址然后通过调用该函数来完成相应得功能的,以下是我从MSDN得来的关于它的声明,详细信息请参考MSDN.LONG APIENTRY CPlApplet(HWND hwndCPl,UINT uMsg,LONG lParam1,LONG lParam2);参数的意义hwndCPl 激活控制面板组件应用程序的窗口句柄uMsg 外界传入的控制消息,CPLApplet函数就是通过该消息去完成相应的任务的lParam1 消息参数1lParam2 消息参数2CPLApplet函数可以接受的控制消息一览表:消息 描述CPL_INIT CPL程序收到的第一个消息,在这儿通常完成控制面板组件数据及变量的初始化工作CPL_GETCOUNT CPLApplet函数在继CPL_INIT消息之后收到的第二个消息,它使得CPLApplet函数返回该CPL文件所包含的控制面板组件数目CPL_INQUIRE CPL_INQUIRE及下一个要介绍的CPL_NEWINQUIRE消息是所有控制面板程序的消息中最重要的两个消息,可以这样说控制面板就是利用这两个消息来取得每个组件的名称、描述及图标等信息。CPL_INQUIRE会将组件信息填入TCPLInfo的结构中,TCPLInfo结构的声明如下:typedef struct tagCPLINFO int idIcon;int idName;int idInfo;LONG lData; CPLINFO;typedef tagCPLINFO TCPLInfo;然后你的程序就可以利用LoadString,LoadIcon(这个API函数已被LoadImage函数取代,不过你还是可以用)等API函数来取得相应的信息CPL_NEWINQUIRECPL_NEWINQUIRE与CPL_INQUIRE消息所完成的功能差不多,但它会将组件信息填入TNewCPLInfo结构而不是 TCPLInfo结构中,一看名称就知CPL_NEWINQUIRE较CPL_INQUIRE后出来,按照常规的思维一般应优先选择后出来得的即使用 CPL_NEWINQUIRE,但这是一个例外,TNewCPLInfo结构虽较TCPLInfo更为完整,但它所包含的资料无法缓存,所以使用 TNewCPLInfo会使开启控制面板的速度减慢,这也是微软文件上注明着”除非必要,否则请尽量以CPL_INQUIRE消息来传递组件信息”的原因CPL_DBLCLK 当用户双击控制面板中组件的图标时就会触发CPL_DBLCLK消息来相应用户的操作,一般是开启一个对话框来供用户进行调整设定,如:”Internet 选项” 就会显示一个有关IE设置的对话框,你可以在该对话框中设置IE的一些属性CPL_STOP 这个消息主要是提供机会给你进行善后工作的,如释放与组件相关的内存.CPL_EXIT 这个消息是你进行善后工作的最后机会,即在应用程序调用FreeLibray函数之前时你可以进行一些善后工作,如:释放内存等提示: 上表所列出的消息顺序也正是CPL程序收到的消息的顺序,即CPL程序是按照CPL_INIT, CPL_GETCOUNT到CPL_EXIT来完成相应的任务的.如果你对上面的描述还感到抽象的话,下面我就已一个实际的例子来说明到底是如何建立控制面板的应用程序。操作步骤如下:1:建立资源文件以便在程序中使用,下图是用Borland Resoure Workshop制作ctrl.rc的情形。图1-1 编辑资源文件提示:1、2表示字符串与图标资源的代号,你也可以去别的名称做好后你可以利用brcc32.exe 将其编译为res资源文件命令如下:brc32 ctrl.rc这样将的到ctrl.res编译后的资源文件,当然你也可以直接利用Borland Resoure Workshop建立Res格式的文件,省去编译这一环节2:打开你的BCB,通过DLL Wizard建立一个DLL工程(因为CPL程序就是DLL文件)3:导出CPLApplet函数,这是最重要的,其它的操作和别的程序没有区别4:从菜单中选取”Project / Options”选项,在“Project Options”选项对话框中将Application页面的“Target file extension”改为“cpl”提示:由于该程序不是可执行文件,所以不能按F9运行,必须通过控制面板或rundll32.exe来运行,首先将其CPL文件Copy到系统目录下,然后利用控制面板来运行或者rundll32.exe来运行,命令如下:rundll32 shell32.dll Control_RunDLL *.cpl源程序如下:#include#include#pragma hdrstop/导入控制面板程序相关的头文件#include#pragma resource ctrl.RES/导出CPlApplet函数extern C _declspec(dllexport) LONG _stdcall CPlApplet(HWND hwndCPl,UINT uMsg,LONG lParam1,LONG lParam2);/实现CPlApplet函数LONG _stdcall CPlApplet(HWND hwndCPl,UINT uMsg,LONG lParam1,LONG lParam2)LPCPLINFO ptCPLInfo;switch (uMsg)case CPL_INIT:ShowMessage(初始化数据或变量!);return 1;case CPL_GETCOUNT:ShowMessage(只有一个组件!);return 1;case CPL_INQUIRE:ShowMessage(设置控制面板组件资源信息!);ptCPLInfo=(LPCPLINFO)lParam2;/将信息填入TCPLInfo的结构中ptCPLInfo-idName=1;ptCPLInfo-idInfo=1;ptCPLInfo-idIcon=2;ptCPLInfo-lData=0;break;case CPL_DBLCLK:ShowMessage(很高兴看到你!);return 0;case CPL_EXIT:ShowMessage(退出控制面板程序!);return 0;return 0;#pragma argsusedint WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)return 1;DllEntryPoint函数是所有DLL文件的入口函数,相当于可执行文件的WinMain函数,#include 语句导入Borland C+ Builder所提供的关于控制面板的相关声明,语句extern C _declspec(dllexport) LONG _stdcall CPlApplet()导出CPLApplet函数提示:VCL如何提供对“控制面板”的支持这一节将在“控制面板知多少(续篇)”介绍控制面板知多少(续篇)VCL如何提供对“控制面板”的支持上面讲了如何写原生的控制面板程序,下面我将介绍VCL是如何支持写控制面板程序的。它主要是引入了一个Ctlpanel单元及 TAppletApplication和TAppletModule类,TAppletApplication代表一个CPL文件, TAppletModule代表一个控制面板组件,在这两个类的帮助下,你可以轻松地完成控制面板程序的编码。奇怪了,你是怎么知道的,其实,只要点选 “Project / View Soure”打开项目源代码,即可发现语句”#include ”表明它引入了Ctlpanel单元,继续追踪Ctlpanel单元(即打开Ctlpanel.hpp文件),你会发现TAppletApplication 与TAppletModule的定义,它们的定义如下:class PASCALIMPLEMENTATION TAppletApplication : public Classes:TComponenttypedef Classes:TComponent inherited;private:unsigned FControlPanelHandle;Classes:TList* FModules;class PASCALIMPLEMENTATION TAppletModule : public Classes:TDataModuletypedef Classes:TDataModule inherited;private:TActivateEvent FOnActivate;TStopEvent FOnStop;这样一步步追踪也不失为一种学习的好方法。一个在VCL大力支持下的控制面板的程序实例:显示你的机器名操作步骤如下:1、选择C+ Builder的“File / New”选项,开启“New Items”对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论