控制面板知多少

原创 2004年05月17日 23:06:00

控制面板知多少<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

控制面板,你了解多少。当你安装了一些应用程序后,是否感觉到你的控制面板增加了一些组件,如安装了Borland C++ Builder,BDE Administrator”就会进入你的控制面板,安装了QuickTime还会增加“QuickTime”组件,这些现象说明了什么,我想它只是说明了一个事实:“控制面板”是可以操纵的,你也可以控制你的控制面板,它并无什么神秘可言,哪到底如何操纵呢,这正是我今天要讨论的主题,在这里我将会带领大家有浅入深地来探讨“控制面板”这个鲜为人知的主题。我主要分3个部分来阐述:(由于文章大小的限制,我决定将其分成两章来介绍)

 

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

2CPL文件的真实身份

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

 

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

       控制面板是什么,它在哪儿? 以前,我也很困惑,只是偶尔从一些关于“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.

CPLApplet函数可以接受的控制消息一览表:

消息                描述

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

CPL_INIT          CPL程序收到的第一个消息,在这儿通常完成控制面板组件数据及变量的初始化工作

 

CPL_GETCOUNT  CPLApplet函数在继CPL_INIT消息之后收到的第二个消息,它使得CPLApplet函数返回该CPL文件所包含的控制面板组件数目

 

CPL_INQUIRE    CPL_INQUIRE及下一个要介绍的CPL_NEWINQUIRE消息是所有控制面板程序的消息中最重要的两个消息,可以这样说控制面板就是利用这两个消息来取得每个组件的名称、描述及图标等信息。CPL_INQUIRE会将组件信息填入TCPLInfo的结构中,TCPLInfo结构的声明如下:

                然后你的程序就可以利用LoadString,LoadIcon(这个API

                函数已被LoadImage函数取代,不过你还是可以用)API

                函数来取得相应的信息

CPL_NEWINQUIRE  

                                  CPL_NEWINQUIRECPL_INQUIRE消息所完成的功能差不多,但它会将组件信息填入TNewCPLInfo结构而不是TCPLInfo结构中,一看名称就知CPL_NEWINQUIRECPL_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_GETCOUNTCPL_EXIT来完成相应的任务的.

如果你对上面的描述还感到抽象的话,下面我就已一个实际的例子来说明到底是如何建立控制面板的应用程序。

操作步骤如下:

1:建立资源文件以便在程序中使用,下图是用Borland Resoure Workshop制作ctrl.rc的情形。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2004-5-162009110.gif

                                   1-1  编辑资源文件

 

提示:12表示字符串与图标资源的代号,你也可以去别的名称做好后你可以利用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 <vcl.h>

#include <windows.h>

#pragma hdrstop

 

    //导入控制面板程序相关的头文件

#include <cpl.h>

 

#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 argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)

{

    return 1;

}

 

DllEntryPoint函数是所有DLL文件的入口函数,相当于可执行文件的WinMain函数,#include <cpl.h>语句导入Borland C++ Builder所提供的关于控制面板的相关声明,语句extern "C" __declspec(dllexport) LONG _stdcall CPlApplet(……)导出CPLApplet函数

提示:VCL如何提供对“控制面板”的支持这一节将在“控制面板知多少(续篇)”介绍

控制面板知多少(续篇)

控制面板知多少(续篇) VCL如何提供对“控制面板”的支持       上面讲了如何写原生的控制面板程序,下面我将介绍VCL是如何支持写控制面板程序的。它主要是引入了一个Ctlpanel单元及TApp...
  • ZQGet
  • ZQGet
  • 2004年05月17日 23:03
  • 875

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

我主要分3个部分来阐述:  1、控制面板是什么,它在哪里?       2、CPL文件的真实身份       3、VCL如何提供对“控制面板”的支持   控制面板是什么,它在哪里?    控制面板是什...
  • naive1010
  • naive1010
  • 2004年11月02日 12:50
  • 1163

mysqldump与innobackupex备份过程你知多少(三)

沃趣科技  罗小波 mysqldump有什么坑吗? 想必大家都知道,mysqldump备份时可以使用--single-transaction + --master-data两个选项...
  • woqutechteam
  • woqutechteam
  • 2017年07月14日 15:48
  • 201

c程序基本算法百例之八—借书方案知多少

#include"stdio.h" int main() { int a,b,c,count=0; printf("借书方案为:/n"); for(a=1;a...
  • garnett2003
  • garnett2003
  • 2011年05月15日 16:06
  • 748

打开java控制面板

cmd 命令行输入 javacpl.exe
  • zhangchao_cn
  • zhangchao_cn
  • 2017年08月24日 14:41
  • 203

用命令启动控制面板

 内容分类: 背景知识 关键词: 控制面板;命令行    当无法用常规方法打开控制面板中的项目时,可用命令方式打开。   启动控制面板命令大全控制面板模块: control.exe命令: rundll...
  • shaopang
  • shaopang
  • 2006年07月05日 16:58
  • 956

win2003控制面板不见了,打开“控制面板”的方法,安全策略

在win2003上安装了一个软件,结果后来要卸载掉,发现控制面板不见了。 右键我的电脑/管理,被提示没有权限?! 肯定是安全策略的问题。 在网络上搜索了一下,自己整理解决方法如下: 百度知道:打开“控...
  • apensu
  • apensu
  • 2010年02月04日 22:28
  • 5246

删除控制面板里面的java

在注册表删除 win开始菜单->运行->regedit 然后找到,并删掉 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Ex...
  • chen136428
  • chen136428
  • 2015年01月09日 10:56
  • 973

c#操纵控制面板

Win7-x64系统下测试通过:用户帐户System.Diagnostics.Process.Start("control.exe", "nusrmgr.cpl");日期和时间System.Diagn...
  • jhqin
  • jhqin
  • 2010年08月20日 16:40
  • 2597

打开控制面板的命令

rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cplwinexec(Pchar(StrCommand),sw_Show); 其中"StrComman...
  • CometNet
  • CometNet
  • 2009年10月01日 01:44
  • 2671
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:控制面板知多少
举报原因:
原因补充:

(最多只允许输入30个字)