“梦之林”通过精心收集,向本站投稿了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控制面板组件及实例(精选6篇)




