控制面板程序(200分)

  • 主题发起人 主题发起人 悍匪
  • 开始时间 开始时间

悍匪

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么做CPL程序?(只给第一个回答正确的)
 
So easy!
写一个DLL程序里面Exports一个函数叫CPLApplet
函数格式可参考Delphi 提供的CPL.PAS
生成的DLL程序改扩展名为CPL,拷贝到System32下就可以了
我是第一个!给我分!!!!
 
在DELPHI里NEW一个控制面板的程序就是了。
 
hi benlei 怎么你也在这呀!
接受答案,分赃了!sorry 卷起千堆雪tyn!
我的分给熟人了!
 
转贴:

1.控制面板程序

1.1CPlApplet

控制面板程序是一种特殊的动态链接库(DLL),首先,其扩展名与一般的动态链接库不同,
不是.DLL而是为.cpl。其次,它的标准入口函数不是DllMain()而是CplApplet()。
CplApplet接收从控制面板发来的消息并作出相应的反映。CPlApplet的函数原形如下:

function CPlApplet(
hwndCPl:HWND; //程序主窗口的句柄
uMsg:word; //发送到控制面板程序的消息
lParam1:Longint; //消息参数
lParam2:Longint //消息参数
):Longint

uMsg有如下几种形式:

消息
;发生时刻
; 相应的处理方法
;
CPL_DBLCLK
; 用户双击了该程序对应的图标
; 显示程序的主界面
;
CPL_EXIT
; CPL_STOP之后
; 释放所有资源
;
CPL_GETCOUNT
; CPL_INIT后
;返回程序中对话框的数目
;
CPL_INIT
;程序被装入内存后
; 初始化工作
;
CPL_INQUIRE*
; CPL_GETCOUNT后
; 设定某个特定窗口的性质
;
CPL_NEWINQUIRE
; CPL_GETCOUNT后
;设定某个特定窗口的性质
;
CPL_SELECT*
; ;
CPL_STOP
; 程序关闭之前
; 释放对话框资源
;
* 是与旧版本的Windows兼容,Windows 9X/NT 4.0不再使用。

1.2控制面板程序中的消息处理过程

CPlApplet函数处理发送到控制面板程序的所有消息。发送到控制面板程序的消息
是按照一定的顺序进行的。

① 当程序被装入内存时,CPlApplet函数接收到CPL_INT消息。当接收到该消息后,
CPlApplet函数应该作一些初始化的工作,例如分配内存等。如果初始化完成,
应该返回非零,否则,返回零,这样程序将被终止。

② 如果CPL_INT被成功处理,CPlApplet函数将接收到CPL_GETCOUNT消息。CPlApplet必须返回对话框的数目。

③ 接着,CPlApplet接收到CPL_NEWINQUIRE消息。此时的lParam2是一个指向NEWCPL_INFO结构的指针。

;Type
; NEWCPL_INFO =Record
; dwSize:Longword; //该结构的大小
; dwFlags:Longword; //未用
; dwHelpContext:Longword; //未用
; lData:integer; //当消息为CPL_DBCLICK或CPL_STOP时,其为返回值
; hIcon:HICON; //对话框的图标的句柄
; szName:array[0..31] of char; //在控制面板中图标下的说明文字。
; szInfo:array[0..63] of char; //在控制面板中状态行中的说明信息。
; szHelpFile:array[0..127] of char; //未用
End;

接收到该消息后,CPlApplet必须填充该结构。指出其名称,提示信息、图标等。

④ 接着,CPlApplet接收到CPL_DBCLICK消息,在这里,一般是显示对话框以及处理用户的输入等。

⑤ 当用户关闭程序时,CPlApplet接收到CPL_STOP消息。此时应该释放分配的内存资源,
若无,则可以忽略这一步。

⑥ 接着,CPlApplet接收到CPL_EXIT消息,Unregister各种窗口。

⑦ 最后,系统调用FreeLibrary将DLL(该控制面板程序)从内存中卸出。

一般情况下,我们只需处理CPL_DBCLICK和CPL_NEWINQUIRE即可。

2.一个简单的例子:

本例是一个CPL的演示程序,其作用在于为某个客户软件设置其Socket的通信端口。
该端口值放在HKEY_LOCAL_MACHINE/Software/silicon/papers下的port中。通过该程序可以更改其端口号。

其源代码如下:

//mycpl.dpr的源代码

library mycpl;

uses
; SysUtils, Classes, u_main in 'u_main.pas' {f_main};

{$E cpl}

exports

CPlApplet ;

begin

end.

//u_main.pas的源代码

unit u_main;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
; ComCtrls, ToolWin, StdCtrls, Buttons,registry;

type
; Tf_main = class(TForm)
; edPort: TEdit;
; btnOk: TBitBtn;
; btnCancel: TBitBtn;
; Label1: TLabel;
; procedure FormCreate(Sender: TObject);
; procedure btnOkClick(Sender: TObject);
; private
; { Private declarations }
; public
; { Public declarations }
; end;

; type
; NEWCPLINFO =record // ncpli
; dwSize:Longword;
; dwFlags:Longword;
; dwHelpContext:Longword;
; lData:integer;
; hIcon:HICON;
; szName:array[0..31] of char;
; szInfo:array[0..63] of char;
; szHelpFile:array[0..127] of char;
end;

; type
; ; PNEWCPLINFO=^NEWCPLINFO;

const CPL_INIT=1;
const CPL_GETCOUNT=2;
const CPL_INQUIRE=3;
const CPL_SELECT=4;
const CPL_DBLCLK=5;
const CPL_STOP=6;
const CPL_EXIT=7;
const CPL_NEWINQUIRE= 8;

var
; f_main: Tf_main;
; aa:TIcon;
; RegF:TRegistry;

function CPlApplet(hwndCPl:HWND; uMsg:word;lParam1:Longint; lParam2:Longint):Longint ;stdcall;
function OnInquire(uAppNum:word; pInfo:PNEWCPLINFO):integer;stdcall;
function OnDblclk(hwndCPl:HWND;uAppNum:word;lData:integer):integer;stdcall;

implementation

{$R *.DFM}
{$R icon.res}

//处理各种消息
Function CPlApplet(hwndCPl:HWND; uMsg:word;lParam1:Longint; lParam2:Longint):Longint ;stdcall;
begin
case uMsg of
; CPL_DBLCLK:
; OnDblclk(hwndCPl, lParam1, lParam2);
; CPL_EXIT:
; result:=0;
; CPL_GETCOUNT:
; result:=1;
; CPL_INIT:
; result:=1;
; CPL_NEWINQUIRE:
; OnInquire(lParam1, PNEWCPLINFO(lParam2));
; CPL_INQUIRE:
; result:= 0; // not handled
; CPL_SELECT:
; result:=1;
; CPL_STOP:
; result:=1;
; else
; result:=0;
; end;
; result:=1;
end;

//填充NEWCPLINFO结构。
function OnInquire(uAppNum:word; pInfo:PNEWCPLINFO):integer;stdcall;
begin
; with pInfo^ do
; begin
; dwSize:=sizeof(NEWCPLINFO);
; dwFlags:=0;
; dwHelpContext := 0;
; lData := 0;
; hIcon:=loadicon(hinstance,'I1');
; szName:='MyDemo';
; szInfo:='MyDemo 系统设置';
; szHelpFile:='';
; end;
; result:=0;
end;

//显示对话框
function OnDblclk(hwndCPl:HWND;uAppNum:word;lData:integer):integer;stdcall;
var
; f_main:TF_main;
begin
; f_main:=TF_main.Create(application);
; f_main.ShowModal;
; result:=0;
end;

//将port的值从注册表中读出,写到Edit edPort中。
procedure Tf_main.FormCreate(Sender: TObject);
var
; port:integer;
begin
; aa:=ticon.Create;
; aa.Handle :=loadicon(hinstance ,'I1');
; if(aa.Handle =0) then showmessage('error icon');
; icon:=aa;
; RegF:=TRegistry.Create;
; RegF.RootKey:=HKEY_LOCAL_MACHINE;
; RegF.OpenKey('SOFTWARE/Silicon/papers',True);
; Port:=0;
; if regF.ValueExists ('port')=true then
; port:=RegF.ReadInteger('port');
; edPort.Text :=inttostr(port);
; RegF.CloseKey;
; RegF.Free ;
end;

//将port的值写回注册表
procedure Tf_main.btnOkClick(Sender: TObject);
begin
; RegF:=TRegistry.Create;
; RegF.RootKey:=HKEY_LOCAL_MACHINE;
; RegF.OpenKey('SOFTWARE/Silicon/papers',True);
; RegF.WriteInteger('port', strtoint(edPort.text));
; RegF.CloseKey;
; RegF.Free ;
end;

end.

说明:
① 其中 icon.res中包含了程序的图标,所以在程序中加入一句{$R icon.res}。
② {$E cpl}表示动态连接库的扩展名为cpl。
③ exports关键字后的表示输出的函数,只需输出CplApplet即可。

3.控制面板程序的安装:

在Delphi中选择project|bulid mycpl编译程序。Mycpl是该示例程序的名字。
然后将mycpl.cpl拷贝到Windows目录下的System目录下即可(在Windows NT 下是System32)。
然后选择|开始|设置控制面板即可看到结果。
 
本贴有严重作弊嫌疑。请注意!
 
可怜的雪儿,白白辛苦了一回,我明白中国有多腐败了,连这不能花的分都送人情。:(
 
为卷老大鸣不平[:(!]
 
都给你们拉!
 
是老黄吗?最近过的如何?在什么地方高就?
to 卷起千堆雪tyn & All:
; ; 是有送分嫌疑(熟人,换我也会这么做的/中国国情),但决非作弊!!!!!!
 
后退
顶部