深入编程:控制面板知多少?
添加时间: 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函数
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 整合开发环境使用技巧

