• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
深入编程:控制面板知多少?
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
深入编程:控制面板知多少?
软件发布 深入编程:控制面板知多少?
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 编程技术 >> VC教程 >> 深入编程:控制面板知多少?

深入编程:控制面板知多少?

添加时间: 2006-2-11 1:41:08  作者: VC教程  阅读次数:2202   来源: http://www.d9soft.com

       

 我主要分3个部分来阐述:(由于文章大小的限制,我决定将其分成两章来介绍)    

  1、控制面板是什么,它在哪里?    

  2、CPL文件的真实身份    

  3、VCL如何提供对“控制面板”的支持

  控制面板是什么,它在哪里?   

  控制面板是什么,它在哪儿? 以前,我也很困惑,只是偶尔从一些关于“Windows系统管理”的书籍朦胧地听到关于“控制面板”的描述:“控制面板的每一项一般都会对应一个.CPL文件,这些文件存于系统目录下,你可以指定控制面板中要显示的项目,也可以隐藏等等”关于如何实现,可能还会教给你一些通过修改注册表来达到目的,是的,这可以达到目的,但我想这只是从一个管理者地角度来看待这个问题的,如果从程序员的角度又如何的,他们的描述能解决你的问题吗?你如何利用程序来达到控制你”控制面板”的目的,你想知道吗,请听下文分解.    

  CPL文件的真实身份    

  上面提到了以“.CPL”扩展名结尾文件”,既然又与控制面板有关,哪我就来分析一下CPL文件到底是什么吧,随便找一些CPL文件,如:main.cpl,access.cpl等,我用Dumpbin测试结果如下:   

   C:\WINDOWS\system32>dumpbin main.cpl    

   Microsoft (R) COFF Binary File Dumper Version 6.00.8168    

   Copyright (C) Microsoft Corp 1992-1998. All rights reserved.    

   Dump of file main.cpl    

   File Type: DLL(由DLL可以知道它是一个DLL文件)    

   C:\WINDOWS\system32>dumpbin /exports appwiz .cpl    

   Microsoft (R) COFF Binary File Dumper Version 6.00.8168    

   Copyright (C) Microsoft Corp 1992-1998. All rights reserved.    

   Dump of file appwiz.cpl    

   File Type: DLL  

   Section contains the following exports for appwiz.dll    

   ordinal hint RVA name    

   1 0 00017926 CPlApplet    

   2 1 00017F05 ConfigStartMenu 

   ......    

   C:\WINDOWS\system32>dumpbin /exports access.cpl    

   Microsoft (R) COFF Binary File Dumper Version 6.00.8168    

   Copyright (C) Microsoft Corp 1992-1998. All rights reserved.    

   Dump of file access.cpl

  File Type: DLL    

   Section contains the following exports for Access.dll    

   ordinal hint RVA name    

   1 0 00004B41 CPlApplet  

   2 1 00004B33 DebugMain    

   3 2 00004B30 DllRegisterServer    

   3 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 消息参数1
  lParam2 消息参数2
  CPLApplet函数可以接受的控制消息一览表:
  消息 描述     

  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_NEWINQUIRE     

  CPL_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
  file://导入控制面板程序相关的头文件 
  #include
  #pragma resource "ctrl.RES"
  file://导出CPlApplet函数
  extern "C" __declspec(dllexport) LONG _stdcall CPlApplet(
  HWND hwndCPl,
  UINT uMsg,
  LONG lParam1,
  LONG lParam2
  );
  file://实现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;
  file://将信息填入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 argsused
  int 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是如何支持写控制面板程序的。它主要是引入了一个Ctlpanel单元及TAppletApplication和TAppletModule类,TAppletApplication代表一个CPL文件,TAppletModule代表一个控制面板组件,在这两个类的帮助下,你可以轻松地完成控制面板程序的编码。奇怪了,你是怎么知道的,其实,只要点选“Project / View Soure”打开项目源代码,即可发现语句”#include ”表明它引入了Ctlpanel单元,继续追踪Ctlpanel单元(即打开Ctlpanel.hpp文件),你会发现TAppletApplication 与TAppletModule的定义,它们的定义如下:

  class PASCALIMPLEMENTATION TAppletApplication : public Classes::TComponent
  {
   typedef Classes::TComponent inherited;
  private:
   unsigned FControlPanelHandle;
   Classes::TList* FModules;
   ......
  };
  class PASCALIMPLEMENTATION TAppletModule : public Classes::TDataModule
  {
   typedef Classes::TDataModule inherited;
  private:
   TActivateEvent FOnActivate;
   TStopEvent FOnStop;
   ......
  };

  这样一步步追踪也不失为一种学习的好方法。

  一个在VCL大力支持下的控制面板的程序实例:显示你的机器名

  操作步骤如下:

  1、选择C++ Builder的“File / New”选项,开启“New Items”对话框(如图下图所示)选择“Control Panel Application”即建立控制面板应用程序,即CPL文件。
 2、属性AppletIcon中设置图标,Caption中设置标题比如:”显示你的机器名”

  1、 在Activate事件填写如下代码来获取机器名

  void __fastcall TAppletModule1::AppletModuleActivate(TObject *Sender,

   int Data)

  { 

   LPTSTR lpBuffer=new char[256]; 

   LPDWORD nSize= new unsigned long(256); 

   GetComputerName(lpBuffer,nSize);  

   ShowMessage("你的计算机名称:"+AnsiString(lpBuffer));

   delete lpBuffer;  

   delete nSize;

  }  

  

请添加描述

  

  图1-2 “New Items”对话框

  提示:在“Applet Module”中选择右键,将出现快捷菜单,你可以简单地完成“安装”、“删除”等功能而不必像上面的例子那样通过“批处理文件”来完成控制面板程序的编译,测试等功能

  提示:如果你想自己体会一下这个程序的功能,你不必通过键盘的输入来达到目的。

 

上下文章:

 

上一篇文章: VC 6.0下自制媒体播放器 下一篇文章: VC++.net 整合开发环境使用技巧

相关文章:

  • NET 拖动无边框窗体编程实例
  • 自学.NET之路-C#编程之基础总结
  • 编程实例 使用C#的BitmapData
  • 如何在系统的控制面板和注册表寻回输入法
  • 杀毒软件存在十大误区,你知道多少?

相关软件:

  • 编程傻瓜--逗死汇编 V1.6
  • KS线切割编程系统 V2.18
  • 软件编程伴侣 4.0
  • 易语言汉语编程环境 V4.10
  • 超想中文汇编编程学习系统(中英对照版) V3.0
  • VFP完全控制大、中、小型数据库编程接口 V12.0

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • VC++之Button控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Scroll Bar
  • VC++之Scroll Bar
  • VC++之List Box/Check List Box控...
  • VC++ Combo Box/Combo Box Ex控件
  • VC++ List Ctrl控件

VC教程阅读排行

  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • VC++之Button控件
  • VC++之Tab Ctrl控件
  • VC++之Edit Box控件
  • VC++之Edit Box控件
  • VC遍历整个目录树查找文件
  • VC++之Scroll Bar
  • VC使用ActiveX控件常见问题

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • VC++之List Box/Check List Box控...
  • 第二章 PowerBuilder 入门之创建新...
  • VC++ List Ctrl控件
  • 第一章 什么是PowerBuilder
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有