利用Delphi编写Windows控制面板组件及实例

时间:2022-12-04 20:11:19 作者:梦之林 综合材料 收藏本文 下载本文

“梦之林”通过精心收集,向本站投稿了6篇利用Delphi编写Windows控制面板组件及实例,下面是小编精心整理后的利用Delphi编写Windows控制面板组件及实例,希望能够帮助到大家。

篇1:利用Delphi编写Windows控制面板组件及实例

利用Delphi编写Windows控制面板组件及实例

张 建 军(中国人民解放军合肥炮兵学院研究生系97级)

韩 莹 (中保财险安徽省铜陵市分公司计财部)

关键词:

在Windows95/NT/98操作系统中,控制面板(Control Panel)提供了定制Windows的操作方法,通过它可以完成设置打印机、显示、网络、添加新硬件等功能。通常控制面板包含20多个组件(*.CPL),分别负责系统某一方面的设置。鼠标双击任一组件图标,控制面板调用相应程序,弹出对话框,允许设置系统参数。确认修改后系统参数保存在Windows注册表或某一配置文件(*.INI)中。

一、控制面板组件基础知识

控制面板是一个Windows应用程序C:WINDOWSCONTROL.EXE,其配置文件是C:WINDOWSCONTROL.INI.控制面板组件是一些动态链接库,其扩展名不是DLL,而是CPL.通常,控制面板组件保存在C:WINDOWSSYSTEM目录下。在CONTROL.INI中有一个[MMCPL]节,该节可指定由CONTROL.EXE调用的动态链接库,其格式一般为:

[MMCPL]

uniqueName=D:PROJECT1.DLL(这里假设PROJECT1为用户编写的控制面板组板文件

名,其访问路径可由读者自行确定)

采用此方法,PROJECT1.DLL不必存放在C:WINDOWSSYSTEM目录下,扩展名不必改为CPL.CONTROL.EXE运行后按以下顺序调用这些动态链接库:

在C:WINDOWSSYSTEM目录下调用MAIN.INI.

已加载并输出CplApplet函数的可安装驱动程序。

在CONTROL.INI[MMCPL]节中指定的DLL.

在C:WINDOWSSYSTEM目录下调用CPL.

因此,编写控制面板组件近似于编写普通DLL.通常一个CPL支持控制面板中的一个组件(即一个图标),也可支持多个组件。本文介绍利用Delphi编写CPL、扩充控制面板组件(一个CPL支持一个或多个组件)的方法。

二、控制面板组件工作流程

1、每个CPL文件必须输出一个CplApplet函数,与CONTROL.EXE之间传递、处理消息。CplApplet函数的原形是:

type

TCPLApplet = function (hwndCPl: THandle; uMsg: DWORD;

lParam1, lParam2: Longint): Longint; stdcall;

其中,hwndCPl是控制面板窗口句柄,uMsg是消息标识,lParam1、lParam2是两个附加参数,具体意义视uMsg的值而定。

2、当CONTROL.EXE把各CPL(或DLL)调入内存时,CONTROL.EXE立刻向CPLApplet发送一条CPL_INIT消息,要求CPL执行全局初始化并分配内存。CPL_INIT是唯一可以返回调用失败的消息。如果初始化成功,CPL返回非零,否则返回零。如果CPL返回零,控制面板终止与CPL通信并卸载此CPL(或DLL)。

3、CPL_INIT消息处理结束后,CONTROL.EXE立刻向CPLApplet发送一条CPL_GETCOUNT消息,CPL返回支持的组件数。

4、CPL_GETCOUNT消息处理结束后,CONTROL.EXE立刻向CPLApplet发送一条CPL_NEWINQUIRE消息,CPL_NEWINQUIRE每次发送一条,以取得每个组件的图标、名称、提示内容(显示在控制面板的状态栏)等信息。lParam1是指定对话框的`数值,该值应在0到(CPL_GETCOUNT - 1)之间。如果CPL_NEWINQUIRE处理成功,返回0.

说明:

◆在Windows3.X系统中,CONTROL.EXE发送的是CPL_INQUIRE消息。为向下兼容,该消息被保留。基于Win32的CPL应使用CPL_NEWINQUIRE.

◆通过判断lParam1的值,可对一个CPL支持的多个组件的图标、名称、提示内容等进行控制。

5、控制面板显示所有查找到的组件图标。鼠标双击任一组件图标,控制面板向其CPL发送一条CPL_DBLCLK消息,CPL显示相应对话框,供用户改变系统设置。

说明:

◆通过检测lParam1的值,可判断用户双击的是一个CPL支持的多个组件中的哪个图标,并运行相应程序。

6、控制面板关闭时,向每个组件发送一条CPL_STOP消息,然后对每个CPL发送一条CPL_EXIT消息,CPL释放内存并卸载。

三、控制面板组件编写实例

1、编程步骤:

在Delphi IDE中选取菜单File-New-DLL-OK.

②在Project1中添加如图所示Form1、Form2……,根据需要设计窗体界面。为简略起见,本文仅以Form1为例。

③Form1主要代码:(为编写基于Win32的CPL,本文以读写Windows注册表为例)

在uses子句添加:Registry.//引用注册表单元

在type部分声明变量:

var

Form1: TForm1;

KeyHandle : HKEY;

ValSize : longint;

Option1 : Integer;

Option2 : Integer;

TForm1.FormActivate代码://打开Windows注册表,读取某特定键值

procedure TForm1.FormActivate(Sender: TObject);

begin

RegOpenKeyEx(HKEY_CURRENT_CONFIG,

'SoftwareMicrosoftwindowsCurrentVersion',

0, KEY_ALL_ACCESS, KeyHandle);

ValSize := SizeOf(Option1);

RegQueryValueEx(KeyHandle,'WinA', nil, nil, @Option1,

@ValSize);

ValSize := SizeOf(Option2);

RegQueryValueEx(KeyHandle,'WinB', nil, nil, @Option2,

@ValSize);

with Form1 do begin

case Option1 of

0: RadioGroup1.ItemIndex:=0;

1: Radiogroup1.ItemIndex:=1;

2: Radiogroup1.ItemIndex:=2;

3: Radiogroup1.ItemIndex:=3;

end;

case Option2 of

0: Radiogroup2.ItemIndex:=0;

1: Radiogroup2.ItemIndex:=1;

2: Radiogroup2.ItemIndex:=2;

3: Radiogroup2.ItemIndex:=3;

end;

end;

end;

TForm1.CancelClick代码://关闭Form1,返回控制面板

procedure TForm1.CancelClick(Sender: TObject);

begin

close;

end;

TForm1.ApplyClick代码://设置注册表键值

procedure TForm1.ApplyClick(Sender: TObject);

begin

with Form1 do begin

Option1:=Radiogroup1.ItemIndex;

Option2:=Radiogroup2.ItemIndex;

end;

RegSetValueEx(KeyHandle,'WinA', 0, REG_BINARY, @Option1, SizeOf(Option1));

RegSetValueEx(KeyHandle,'WinB', 0, REG_BINARY, @Option2, SizeOf(Option2));

end;

TForm1.FormClose代码://关闭注册表

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

RegCloseKey(KeyHandle);

end;

④修改Project1代码如下:

library Project1;

uses

Cpl,

Windows,

Forms,

Unit1 in 'Unit1.pas' {Form1},

Unit2 in 'Unit2.pas' {Form2};

{$R *.RES}

procedure ExecuteApp;

{$E dll}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end;

procedure ExecuteApp2;

{$E dll}

begin

Application.Initialize;

Application.CreateForm(TForm2, Form2);

Application.Run;

end;

function CPlApplet(hwndCPl: THandle; uMsg: DWORD;

lParam1, lParam2: LongInt):LongInt;stdcall;

var

NewCplInfo:PNewCplInfo;

begin

Result:=0;

case uMsg of

CPL_INIT:

Result:=1;

CPL_GETCOUNT:

Result:=2;

CPL_NEWINQUIRE:

begin

NewCplInfo:=PNewCplInfo(lParam2);

with NewCplInfo^ do

begin

dwSize:=SizeOf(TNewCplInfo);

dwFlags:=0;

dwHelpContext:=0;

lData:=0;

if lParam1=0 then

begin

szName:=‘新的控制面板组件';

hIcon:=LoadIcon(HInstance,'ICON’);

szInfo:=‘这是一个尝试';

end

else

begin

szName:=’新的控制面板组件2';

hIcon:=LoadIcon(HInstance,'ICON2‘);

szInfo:=’这是一个尝试2';

end;

szHelpFile:='';

end;

end;

CPL_DBLCLK:

begin

if lParam1=0 then

ExecuteApp

else

ExecuteApp2;

end;

else Result:=0;

end;

end;

exports

CPlApplet;

begin

end.

⑤选取菜单ProjectOptionsApplication,在Target file extension中输入:DLL.在Load Icon中选择DLL图标。

⑥选取菜单RunParameters,在Host application中选择一主程序。例如:D:PROGRAM FILESBORLANDDELPHI3HELPTOOLSHCW.EXE.

⑦按F9运行程序,生成Project1.dll.

⑧将Project1.dll改名为Project1.cpl,存入C:WINDOWSSYSTEM目录下。或者,在CONTROL.INI的[MMCPL]中添加:

uniqueName=D:PROJECT1.DLL(具体视DLL所在路径而定)

⑨启动控制面板,可以看到③中指定的图标(一个或多个)已出现在控制面板中,鼠标双击图标,弹出相应的Form1、Form2……

说明:

编程时也可将有关参数存放在某一INI文件中,操作方法不再赘述。

其它应用程序可通过操作INI文件或Windows注册表得到所需参数。

◆本文所述编写DLL方法同样适用于VC、BC、C++Builder等开发工具,但应注意语法、变量、函数原型等不同要求。

以上程序在Delphi3.0/4.0、简体中文Windows 95/NT/98环境中调试通过。

一九九九年五月十日

作者通信地址:(230031)安徽省合肥市炮兵学院研究生系97级 张建军(收)

作者电话: 0551-5560324(张建军宿舍)

0551-5562566转68750、68210(研究生系值班室)

作者Email: **

篇2:利用Delphi全面控制Windows任务栏

利用Delphi全面控制Windows任务栏

(中国人民解放军合肥炮兵学院研究生系97级)

韩莹

(中保财险安徽省铜陵市分公司计财部) ??

使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块 任务栏。从系统功能角度而言,整个任务栏包括几个不同的子区域,从左至右依次是:开始 按钮、应用程序切换区(Application Switch Bar)、任务栏通知区(Notification Area)以 及任务栏时钟。与其它Windows应用程序相同,任务栏程序(systray.exe)由几个不同的窗体 组成,这些窗体是具有各自的窗口类名、显示方式等信息。因此,只要得到有关窗口信息, 即可通过编程全面控制Windows任务栏的不同区域。?

1. 编程思想?

(1)任务栏窗体的窗口信息为:?

①任务栏的窗口类名是:ShellTrayWnd。?

②开始按钮的窗口类名是:Button。?

③应用程序切换区的窗口类名是:ReBarWindow32。?

④任务栏通知区的窗口类名是:TrayNotifyWnd。?

⑤任务栏时钟的'窗口类名是:TrayClockWClass。?

(2)调用FindWindow函数得到任务栏的窗口句柄。?

(3)调用FindWindowEx函数得到任务栏各子区域的窗口句柄。?

(4)根据窗口句柄,调用ShowWindow函数控制任务栏各区域显示或隐藏        (show/hide);调用En ableWindow函数控制任务栏各区域有效或无效(enabled/disabled)。?

2. 编程方法?

(1)在Delphi3.0 IDE中新建工程Project1, Project1中包含Form1, 窗体如下图所示:

(2)定义窗口句柄数组:Wnd:array[0..4] of THandle;?

(3)GetHandles过程代码如下:?

procedure TForm1.GetHandles;?

begin?

//得到Tray Bar的窗口句柄;?

Wnd[0]:=FindWindow(′ShellTrayWnd′,nil);?

//得到开始按钮的窗口句柄;?

Wnd[1]:=FindWindow(′ShellTrayWnd′,nil);?

Wnd[1]:=FindWindowEx(Wnd[1],HWND(0),′Button′,nil);?

//得到应用程序切换区的窗口句柄;?

Wnd[2]:=FindWindow(′ShellTrayWnd′,nil);?

Wnd[2]]:=FindWindowEx(Wnd[2],HWND(0),′ReBarWindow32′,nil);?

//得到任务栏通知区的窗口句柄;?

Wnd[3]:=FindWindow(′ShellTrayWnd′,nil);?

Wnd[3]:=FindWindowEx(Wnd[3],HWND(0),′TrayNotifyWnd′,nil);?

//得到任务栏时钟的窗口句柄;?

Wnd[4]:=FindWindow(′ShellTrayWnd′,nil);?

Wnd[4]:=FindWindowEx(Wnd[4],HWND(0),′TrayNotifyWnd′,nil);?

Wnd[4]:=FindWindowEx(Wnd[4],HWND(0),′TrayCLockWClass′,nil);?

end;?

(4)EnableOrDisable过程代码如下:?

procedure TForm1.EnableOrDisable(Sender:TOBject);?

begin?

GetHandles;?

if TCheckBox(Sender). Checked then?

case TCheckBox(Sender). Tag of?

0: EnableWindow(Wnd[0], False);?

1: EnableWindow(Wnd[1], False);?

2: EnableWindow(Wnd[2], False);?

3: EnableWindow(Wnd[3], False);?

4: EnableWindow(Wnd[4], False);?

end?

else?

case TCheckBox(Sender). Tag of?

0: EnableWindow(Wnd[0], True);?

1: EnableWindow(Wnd[1], True);?

2: EnableWindow(Wnd[2], True);?

3: EnableWindow(Wnd[3], True);?

4: EnableWindow(Wnd[4], True);?

end;?

end;?

(5)HideOrShow过程代码如下:?

procedure TForm1.HideOrShow(Sender:TObject);?

begin?

GetHandles;?

if TCheckBox(Sender). Checked then?

case TCheckBox(Sender). Tag of?

0: ShowWindow(Wnd[0],SWHIDE);?

1: ShowWindow(Wnd[1],SWHIDE);?

2: ShowWindow(Wnd[2],SWHIDE);?

3: ShowWindow(Wnd[3],SWHIDE);?

4: ShowWindow(Wnd[4],SWHIDE);?

end?

else?

case TCheckBox(Sender). Tag of?

0: ShowWindow(Wnd[0],SWShow);?

1: ShowWindow(Wnd[1],SWShow);?

2: ShowWindow(Wnd[2],SWShow);?

3: ShowWindow(Wnd[3],SWShow);?

4: ShowWindow(Wnd[4],SWShow);?

end;?

end;?

(6)FormClose事件代码如下://将Windows任务栏恢复到正常状态;?

procedure TForm1.FormClose(Sender:TObject; var Action: TCloseAction);?

var i:Integer;?

begin?

for i:=0 to 4 do?

begin?

EnableWindow(Wnd[i],True);?

ShowWindow(Wnd[i],SWShow);?

end;?

end;?

(7)按F9运行程序。以上程序在Delphi3.0/4.0、Windows95/98简体中文版环境下调试通过。 ?

(8)说明:本文所述方法同样适用于VB、VC、BC、C++Builder等编程工具,但应注意语法、变量类型等不同要求。?

篇3:DELPHI编写IIS过滤器实例网站安全

Library BaGuaIISFilter;

uses

SysUtils,

Windows,Messages;

const

HTTP_FILTER_MAJOR           = 1; { major version of this spec }

HTTP_FILTER_MINOR           = 0; { minor version of this spec }

SF_MAX_USERNAME             = 257;

SF_MAX_PASSWORD             = 257;

SF_MAX_FILTER_DESC_LEN      = 257;

{ SF_STATUS_TYPE }

SF_STATUS_TYPE                      = $8000000;   { base value }

SF_STATUS_REQ_FINISHED              = SF_STATUS_TYPE;

SF_STATUS_REQ_FINISHED_KEEP_CONN    = SF_STATUS_TYPE + 1;

SF_STATUS_REQ_NEXT_NOTIFICATION     = SF_STATUS_TYPE + 2;

SF_STATUS_REQ_HANDLED_NOTIFICATION = SF_STATUS_TYPE + 3;

SF_STATUS_REQ_ERROR                 = SF_STATUS_TYPE + 4;

SF_STATUS_REQ_READ_NEXT             = SF_STATUS_TYPE + 5;

SF_NOTIFY_SECURE_PORT               = $00000001;

SF_NOTIFY_NONSECURE_PORT            = $00000002;

SF_NOTIFY_READ_RAW_DATA             = $00008000;

SF_NOTIFY_PREPROC_HEADERS           = $00004000;

SF_NOTIFY_AUTHENTICATION            = $00002000;

SF_NOTIFY_URL_MAP                   = $00001000;

SF_NOTIFY_SEND_RAW_DATA             = $00000400;

SF_NOTIFY_LOG                       = $00000200;

SF_NOTIFY_END_OF_NET_SESSION        = $00000100;

SF_NOTIFY_ORDER_HIGH                = $00080000;

SF_NOTIFY_ORDER_MEDIUM              = $00040000;

SF_NOTIFY_ORDER_LOW                 = $00020000;

SF_NOTIFY_ORDER_DEFAULT             = SF_NOTIFY_ORDER_HIGH;

SF_NOTIFY_ORDER_MASK                = (SF_NOTIFY_ORDER_HIGH or SF_NOTIFY_ORDER_MEDIUM or SF_NOTIFY_ORDER_LOW);

type

PVOID = Pointer;

LPVOID = Pointer;

PCardinal = ^Cardinal;

SF_REQ_TYPE = (SF_REQ_SEND_RESPONSE_HEADER, SF_REQ_ADD_HEADERS_ON_DENIAL,

SF_REQ_SET_NEXT_READ_SIZE, SF_REQ_SET_PROXY_INFO);

Type

TFuncPlaceHolder = POINTER;

THTTP_FILTER_CONTEXT = record

cbSize              : DWORD;

Revision            : DWORD;

ServerContext       : PVOID;

ulReserved          : DWORD;

fIsSecurePort       : BOOL;

pFilterContext      : PVOID;

GetServerVariable   : TFuncPlaceHolder; {TGetServerVariable;}

AddResponseHeaders : TFuncPlaceHolder; {TAddResponseHeaders;}

WriteClient         : TFuncPlaceHolder; {TWriteClient;}

AllocMem            : TFuncPlaceHolder; {TAllocMem;}

ServerSupportFunc   : TFuncPlaceHolder; {TServerSupportFunc;}

end;

HTTP_FILTER_CONTEXT = THTTP_FILTER_CONTEXT;

PHTTP_FILTER_CONTEXT = ^HTTP_FILTER_CONTEXT;

TGetServerVariable   = Function(var pfc           : THTTP_FILTER_CONTEXT;

VariableName : PChar;

Buffer        : LPVOID;

BuffSize      : PCardinal) : BOOL;

StdCall;

TAddResponseHeaders = Function(var pfc           : THTTP_FILTER_CONTEXT;

Headers       : PChar;

Reserved      : DWORD) : BOOL;

StdCall;

TWriteClient         = Function(var pfc           : THTTP_FILTER_CONTEXT;

Buffer        : LPVOID;

dwBytes       : LPDWORD;

Reserved      : DWORD) : BOOL;

StdCall;

TAllocMem            = Procedure(var pfc          : THTTP_FILTER_CONTEXT;

cbSize       : DWORD;

dwReserved   : DWORD);

TServerSupportFunc = Function(var   pfc           : THTTP_FILTER_CONTEXT;

sfReq         : SF_REQ_TYPE;

pData         : PVOID;

ul1           : DWORD;

ul2           : DWORD) : BOOL;

StdCall;

THTTP_FILTER_RAW_DATA = record

pvInData    : PVOID;

cbInData    : DWORD;

cbInBuffer : DWORD;

dwReserved : DWORD;

end;

HTTP_FILTER_RAW_DATA   = THTTP_FILTER_RAW_DATA;

PHTTP_FILTER_RAW_DATA = ^HTTP_FILTER_RAW_DATA;

TGetHeader = Function(var pfc        : THTTP_FILTER_CONTEXT;

lpszName   : PChar;

lpvBuffer : LPVOID;

lpdwSize   : LPDWORD) : BOOL; StdCall;

TSetHeader = Function(var pfc : THTTP_FILTER_CONTEXT;

lpszName   : PChar;

lpszValue : PChar) : BOOL; StdCall;

TAddHeader = Function(var pfc : THTTP_FILTER_CONTEXT;

lpszName   : PChar;

lpszValue : PChar) : BOOL; StdCall;

THTTP_FILTER_PREPROC_HEADERS = record

GetHeader   : TGetHeader;

SetHeader   : TSetHeader;

AddHeader   : TAddHeader;

dwReserved : DWORD;

end;

HTTP_FILTER_PREPROC_HEADERS   = THTTP_FILTER_PREPROC_HEADERS;

PHTTP_FILTER_PREPROC_HEADERS = ^HTTP_FILTER_PREPROC_HEADERS;

THTTP_FILTER_AUTHENT = record

pszUser         : PChar;

cbUserBuff      : DWORD;

pszPassword     : PChar;

cbPasswordBuff : DWORD;

end;

HTTP_FILTER_AUTHENT   = THTTP_FILTER_AUTHENT;

PHTTP_FILTER_AUTHENT = ^HTTP_FILTER_AUTHENT;

THTTP_FILTER_URL_MAP = record

pszURL : PChar;

pszPhysicalPath : PChar;

cbPathBuff : DWORD;

end;

HTTP_FILTER_URL_MAP   = THTTP_FILTER_URL_MAP;

PHTTP_FILTER_URL_MAP = ^HTTP_FILTER_URL_MAP;

THTTP_READ_FILTER_RAW_DATA    = record

end;

HTTP_READ_FILTER_RAW_DATA     = THTTP_READ_FILTER_RAW_DATA;

PHTTP_READ_FILTER_RAW_DATA    = ^HTTP_READ_FILTER_RAW_DATA;

THTTP_FILTER_LOG = record

pszClientHostName : PChar;

pszClientUserName : PChar;

pszServerName      : PChar;

pszOperation       : PChar;

pszTarget          : PChar;

pszParameters      : PChar;

dwHttpStatus       : DWORD;

dwWin32Status      : DWORD;

end;

HTTP_FILTER_LOG   = THTTP_FILTER_LOG;

PHTTP_FILTER_LOG = ^HTTP_FILTER_LOG;

THTTP_FILTER_VERSION = record

dwServerFilterVersion : DWORD;

dwFilterVersion        : DWORD;

lpszFilterDesc         : array [0..(SF_MAX_FILTER_DESC_LEN-1)] of Char;

dwFlags                : DWORD;

end;

HTTP_FILTER_VERSION = THTTP_FILTER_VERSION;

PHTTP_FILTER_VERSION = ^HTTP_FILTER_VERSION;

procedure LogInfo (aStr : PChar);

const

LogFileName = 'c:chtLog.txt';

Var

ds: TCopyDataStruct;

hd: THandle;

OutFile : TextFile;

begin

ds.cbData := Length (aStr) + 1;

GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存

StrCopy (ds.lpData, PChar (aStr));

Hd := FindWindow (nil, '红盟八卦阵系统'); // 获得接受窗口的句柄

if Hd  0 then

SendMessage (Hd, WM_COPYDATA, 0,

Cardinal(@ds)) // 发送WM_COPYDATA消息

else MessageBox(0,'没有发现红盟八卦阵系统!','提示',0);

FreeMem (ds.lpData); //释放资源

AssignFile (OutFile, LogFileName);

If FileExists (LogFileName) then Append (OutFile) else Rewrite(OutFile);

Writeln (OutFile, aStr);

CloseFile (OutFile);

end;

Function GetFilterVersion(var pVer : HTTP_FILTER_VERSION) : BOOL; export; stdcall;

begin

try

pVer.dwFilterVersion := MAKELONG(0, 1);

StrPCopy(pVer.lpszFilterDesc, 'IIS过滤器 - IIS保镖');

pVer.dwFlags := (SF_NOTIFY_SECURE_PORT or SF_NOTIFY_NONSECURE_PORT or

SF_NOTIFY_URL_MAP or SF_NOTIFY_ORDER_DEFAULT or SF_NOTIFY_READ_RAW_DATA);

result := True;

except

result := False;

end;

end;

Function HttpFilterProc(var pfc : HTTP_FILTER_CONTEXT;

NotificationType : DWORD;

pvNotification : LPVOID) : DWORD; export; stdcall;

var

pvHTTP_FILTER_URL_MAP : HTTP_FILTER_URL_MAP;

pvHTTP_READ_FILTER_RAW_DATA : string;

Buffer : Array[0..1023] of Char;

BuffSize    : DWORD;

HisAddress : String;

function OnUrlMap : DWORD;

begin

try

BuffSize := 1024;

pvHTTP_FILTER_URL_MAP :=   HTTP_FILTER_URL_MAP(pvNotification^);

TGetServerVariable (pfc.GetServerVariable) (pfc, 'REMOTE_ADDR', @Buffer, @BuffSize);

HisAddress := StrPas(Buffer);

LogInfo(pchar(

'客户IP : ' + HisAddress   +

'URL : ' + pvHTTP_FILTER_URL_MAP.pszURL + ^M^J +

'路径 : ' + pvHTTP_FILTER_URL_MAP.pszPhysicalPath));

if Not CheckURL(pvHTTP_FILTER_URL_MAP.pszURL) then begin

result := SF_STATUS_REQ_ERROR;

end

else begin

result := SF_STATUS_REQ_NEXT_NOTIFICATION;

end;

except

result := SF_STATUS_REQ_ERROR;

end;

end;

function OnReadUserGet : DWORD;

begin

try

BuffSize := 1024;

pvHTTP_READ_FILTER_RAW_DATA := String(pvNotification);

TGetServerVariable (pfc.GetServerVariable) (pfc, 'REMOTE_ADDR', @Buffer, @BuffSize);

HisAddress := StrPas(Buffer);

LogInfo(pchar(

'客户IP : ' + HisAddress   +

'URL : ' + pvHTTP_READ_FILTER_RAW_DATA + ^M^J ));

result := SF_STATUS_REQ_NEXT_NOTIFICATION;

except

result := SF_STATUS_REQ_ERROR;

end;

end;

begin

Case NotificationType of

SF_NOTIFY_URL_MAP         : begin

result := OnUrlMap;

end;

SF_NOTIFY_READ_RAW_DATA   : begin

result := OnReadUserGet;

end;

else                        begin

result := SF_STATUS_REQ_NEXT_NOTIFICATION;

end;

end;

end;

exports

HttpFilterProc,

GetFilterVersion;

end.

篇4:Windows 7利用节能组件提高电池使用时间

STEP 01:预设节能方案

Windows 7内置了优秀的电源管理机制,并预设了电源管理方案,可满足用户的基础节能需求,例如在用电池供电时,可单击任务栏的电池图标,然后可选择“节能”选项(如图1),这样系统会自动进入低功耗模式,帮助用户节省电池电量,

●图1 选择“节能”选项

对于老本来说,由于屏幕采用CCFL背光,功耗相对比较大,建议适当降低屏幕亮度来节省功耗,方法是点一下“调整屏幕亮度”,然后根据需要向左边调节亮度滑块(如图2),经测试,将亮度调节到60%后,在不影响使用情况下,可节省大约18%电池电量。

●图2 调节屏幕亮度

STEP 02:定制节能方案

对于商务人士,Win7预设节能方案无法满足需求,此时不妨自定义节能方案,方法是进入“电源选项”,输入“计划名称”(例如3G上网),然后点击“下一步”按钮(如图3),

●图3 自定义节能方案

在“用电池”列表下(如图4),设置1分钟内自动降低屏幕亮度,2分钟后自动关闭显示屏,在5分钟后自动进入休眠状态,同时降低屏幕亮度值,并点击“创建”按钮,这样在3G上网时,切换到“3G上网”模式下即可提升电池续航时间。

●图4 创建个性化的节能设置

STEP 03:高级节能方案

为了挖掘节能潜力,Win7允许对每个部件进行节能控制,方法是选择“3G上网”计划后,点击“更改高级电源设置”,然后对每个部件进行节能设置,例如展开“无线适配器设置”下的“节能模式”,将“使用电池”设置为“低节能”模式(如图5)。

●图5 对单个部件进行节能控制

在3G上网时,几乎很少用USB外设,此时可展开“USB设置”下的“USB选择暂停性设置”,将“使用电池”设置“已停用”。

此外,还可针对硬盘、显卡、CPU等部件进行节能控制,例如展开“处理器电源管理”,将“最小处理器状态”的使用电池设置为“100%”(如图6),这样CPU会一直工作在低功耗模式下,据测试,合理设置节能方案后,可让老本提升接近1小时续航时间。

●图6 控制处理器的能耗

篇5:Delphi 组件撰写常问问题.net

1 此份文件的目的为何? 这份文件的目的是为了解答有关撰写 Delphi组件时常见或文件上找不到的问题,我曾经花了一段很长的时间来了解探索 TD ataLink 类别,这让我觉得应该将撰写组件时常遇到的问题及经验心得写下来,分享给大家。不过我并不能保证写在这份

1 此份文件的目的为何?

这份文件的目的是为了解答有关撰写 Delphi组件时常见或文件上找不到的问题。我曾经花了一段很长的时间来了解探索TDataLink 类别,这让我觉得应该将撰写组件时常遇到的问题及经验心得写下来,分享给大家。不过我并不能保证写在这份文件里头的解答完全正确。如果你对其中的任何问题有更好的解决方法,或认为有什么信息适合放在这份文件里的话,请告知作者。有任何错误或缺漏也欢迎指正。

除了再加上更多的问题及解答外,我试着再补充两个部分:进阶程序设计师喜爱的工具:这也许跟组件设计没有直接的关系但至少它们跟 Delphi有关系。

2 在整合环境中如何找出组件所产生的问题?

唯一能找出问题的方法只有:

在 Delphi 整合环境的 Tools|Options 对话框的 Library 页中将『Compile with debug info』选项打勾。

选 Component|Rebuild Library 重新编译组件库。

从 Turbo Debugger 中执行 Delphi。

选File|Change Dir移至包含组件程序代码的目录下。

如果你的组件发生GPF时就可以检视堆栈然后得知到底是哪些发生问题了。

2 如何检视 Delphi 所产生的汇编语言码?

的回答:

开启登录编辑程序(REGEDIT.EXE),接着到『HKEY_CURRENT_USERSoftwareBorlandDelphi2.0Debugging』下新增一个字符串机码『EnableCPU』,将它的字符串值设为『1』。此后Delphi整合环境的View选单下就会多一个『CPU』选项,它会开启一个窗口来检视目前程序指令的内存及汇编语言。你可以在侦错时利用单步追踪或其它方法来观察它。

3 我可以在执行时期动态建立组件,但在设计时期就会发生错误。为什么?

你的组件必须继承自TComponent类别或其衍生类别。

你的组件建构函式及灭构函式宣告必须看起来像这样:

constructor Create(AOwner: TComponent); override;

destructor Destroy; override ;

所有在published区段宣告的字段型态必须是ordinal、single、double、extended 、comp、currency、string、small set(译注:指元素编号不超过0..31这个范围的集合;平常的集合可容许的范围为0..255)、method pointer或class其中一种。如果你宣告了其它型态的字段,Delphi编译器并不会检查出错误。然而当你使用这个组件时依然会得到一个GPF。

如果你想让TMyComponent组件可以在设计时期操作,注意下面的宣告会引发十分严重的问题:

type TComplex = record

RealPart: Double;

ComplexPart: Double;

end;

class TMyComponent = Class(TComponent)

private

F1: TComplex;

published

property P1: TComplex read F1 write F1;

end;

4 如何撰写一个无法放置到表格上的组件?

如果你不想让使用者将组件拉曳至表格上的话,使用 RegisterNoIcon 及 RegisterClass 程序来注册组件。

2.5 在程序代码编辑器中快速切换程序区段最简单的方法是什么?

在探索 VCL 原始程序代码时,强烈建议你最好熟悉程序代码编辑器里的书签功能。使用方法很简单:Ctrl-Shift-N,N 是从 0 至 9 的数字,用来设定一个书签。此后就可以使用 Ctrl-N 来跳跃至书签处。(译注:使用这项功能真的可以节省你许多来回卷动程序及找寻函式的时间,别迟疑了,快学吧!)

6 如何使我的组件在按下鼠标右键时出现快速功能选单?

你必须要建立一个组件编辑器,

组件编辑器决定了组件在设计时期时对鼠标键的反应及动作,你可以为组件定义它自己的快速功能选单。

建立组件编辑器的步骤大致如下:

从 TComponentEditor 类别继承一个新的类别。

改写类别的 GetVerbCount、GetVerb及 ExecuteVerb方法。

在 Register 程序中使用 RegisterComponentEditor 程序来注册此组件编辑器。

有关组件编辑器这个主题在『Developing Delphi Components』这本书中有详尽的解说及信息。

7 为什么组件在设计时期会出现『I/O 103』的错误?

你可能在组件中使用了Writeln这个程序。

8 为什么组件编辑器不会将组件属性的变动储存起来?

我发现有时自制的组件编辑器不会将组件属性储存起来。设计时期一切正常,但是储存起来再重新读入后就有问题了。原因是你很可能忘了在组件编辑器中呼叫此方法:

Designer.Modified;

如此一来Delphi才会知道你的组件编辑器更改过属性值了。

9 如何在组件中加入滚动条组件并让它在设计时期能动作?

你的滚动条组件类别必须处理 CM_DESIGNHITTEST 组件讯息才行。

TMyScrollBar = class (TScrollBar)

procedure CMDesignHitTest

(var Message: TCMDesignHitTest); message CM_DESIGNHITTEST;

end;procedure TMyScrollBar.CMDesignHitTest( var Message: TCMDesignHitTest);

begin

Message.Result := 1;

end;

你的组件必须以以下方法建立滚动条:

TMyScrollBar.Create(nil);

而不是

TMyScrollBar.Create(Self);

10 如何建立Windows95式样的滚动条?

你必须设定滚动条的页面大小。你可以用以下的程序代码来做:

procedure SetPageSize(ScrollBar: TScrollBar; PageSize: Integer);

var

ScrollInfo: TScrollInfo;

begin

ScrollInfo.cbSize := Sizeof (ScrollInfo);

ScrollInfo.fMask := SIF_PAGE;

ScrollInfo.nPage := PageSize;

SetScrollInfo (ScrollBar.Handle, SB_CTL, ScrollInfo, True);

end;

要取得目前页面大小可用如下方法:

function GetpageSize (ScrollBar: TScrollBar): Integer;

var

ScrollInfo: TScrollInfo;

begin

if HandleAllocated then

begin

ScrollInfo.cbSize := SizeOf (ScrollInfo);

ScrollInfo.fMask := SIF_PAGE;

GetScrollInfo (ScrollBar.Handle, SB_CTL, ScrollInfo);

Result := ScrollInfo.nPage;

end;

end;

共5页: 1 [2] [3] [4] [5] 下一页

原文转自:www.ltesting.net

篇6:Windows 10.1控制面板即将消失

很多用户都呼吁Windows彻底取消控制面板,UserVoice上关于这个话题的投票已经获得了1.8万个支持,也是迄今最成功的建议之一,Windows 10已经基本开发完成,控制面板必然保留,或许到了Windows 10.1里就可以说拜拜了

时代总是在进步,即便再经典、大家再熟悉的东西也会早晚说再见。Windows 10虽然没有取消传统的控制面板,但已经加入了“PC设置”这么一个单独的应用,逐渐接管控制面板的职责,后者也将逐渐最终消失。

比起经典的控制面板,PC设置的新式菜单布局更加合理,项目更易寻找,特别是更适合触摸操作,在平板、手机上效果更佳,更何况如今的移动用户更喜欢去设置里倒腾,年轻点的可能都不知道控制面板为何物了。

很多用户都呼吁Windows彻底取消控制面板,UserVoice上关于这个话题的投票已经获得了1.8万个支持,也是迄今最成功的建议之一,

发起者称,控制面板和PC设置的很多条目是重复的,为什么不让用户在一个地方控制所有设置?

不过仔细对比就可以发现,PC设置目前还不是很全面,缺乏控制面板里的不少条目,说明它仍然“羽翼未丰”,有继续存在的价值。

Windows Insider内测主管Gabriel Aul也同意这一说法,并表示在PC设置支持所有选项条目之前,控制面板会继续存在。换言之,设置弄好了,控制面板也就该退休了。

Windows 10已经基本开发完成,控制面板必然保留,或许到了Windows 10.1里就可以说拜拜了。

windows写权限变成可执行权限的利用

Delphi笔试题目

实例讲解如何利用网页编辑器入侵 武林安全网

windows系统快速进入控制面板方法总结电脑新手办公/数码

个人简历编写

如何编写大事记

小学教学计划如何编写

高中生编写寓言故事

编写寓言故事300字

编写童话故事作文300

利用Delphi编写Windows控制面板组件及实例(精选6篇)

欢迎下载DOC格式的利用Delphi编写Windows控制面板组件及实例,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档