function TCopyHook.CopyCallback(Wnd: HWND; wFunc, wFlags: UINT;
pszSrcFile: PAnsiChar; dwSrcAttribs: DWORD; pszDestFile: PAnsiChar;
dwDestAttribs: DWORD): UINT;
const
FO_COPY = 2;
FO_DELETE = 3;
FO_MOVE = 1;
FO_RENAME = 4;
var
sOp:string;
begin
Case wFunc of
FO_COPY: sOp:=format(/'你确定要将 %s 拷贝到 %s 吗?/',[pszSrcFile,pszDestFile]);
FO_DELETE: sOp:=format(/'你确定要将 %s 删除吗?/',[pszSrcFile]);
FO_MOVE: sOp:=format(/'你确定要将 %s 转移到 %s 吗?/',[pszSrcFile,pszDestFile]);
FO_RENAME: sOp:=format(/'你确定要将 %s 重命名为 %s 吗?/',[pszSrcFile,pszDestFile]);
else
sOp:=format(/'无法识别的操作代码 %d/',[wFlags]);
end;
// 提示,让用户决定是否执行操作
Result := MessageBox(Wnd, PChar(sOp),
/'文件挂钩演示/', MB_YESNOCANCEL);
end;
{ TCopyHookFactory }
function TCopyHookFactory.GetProgID: string;
begin
Result := /';
end;
procedure TCopyHookFactory.UpdateRegistry(Register: Boolean);
var
ClsID: string;
begin
ClsID := GUIDToString(ClassID);
inherited UpdateRegistry(Register);
ApproveShellExtension(Register, ClsID);
if Register then
file://将clsid 加入到注册表的CopyHookHandlers中
CreateRegKey(/'directory//shellex//CopyHookHandlers///' + ClassName, /',
ClsID)
else
DeleteRegKey(/'directory//shellex//CopyHookHandlers///' + ClassName);
end;
procedure TCopyHookFactory.ApproveShellExtension(Register: Boolean;
const ClsID: string);
const
SApproveKey = /'SOFTWARE//Microsoft//Windows//CurrentVersion//Shell Extensions//Approved/';
begin
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
if not OpenKey(SApproveKey, True) then Exit;
if Register then WriteString(ClsID, Description)
else DeleteValue(ClsID);
finally
Free;
end;
end;
const
CLSID_CopyHook: TGUID = /'{66CD5F60-A044-11D0-A9BF-00A024E3867F}/';
LIBID_CopyHook: TGUID = /'{D2F531A0-0861-11D2-AE5C-74640BC10000}/';
initialization
TCopyHookFactory.Create(ComServer, TCopyHook, CLSID_CopyHook,
/'CR_CopyHook/', /'文件操作挂钩演示/',ciMultiInstance, tmApartment);
end.
将文件保存为CopyMain.Pas文件,然后编译程序为CopyHook.Dll文件,然后注册CopyHook.Dll文件,你可以使用Windows提供的RegSvr32.exe来注册,注册的方法是在Dos窗口中进入Windows的System子目录,然后在其中输入Regsvr32 x://xxx//xxx//copyhook.dll ,其中x://xxx//xxx//是编译的CopyHook.dll所在的全路径名。也可以在Run菜单中选择Register ActiveX Server来注册。
当文件注册成功之后,在Windows的Explore中任意改变一个文件夹的名字或者移动一个目录,就会有一个提示框弹出,提示用户是否确定执行操作。
按“是”将执行文件夹操作,按“否”或者“取消”将取消相应的文件夹操作。
上面介绍的只是Delphi实现Windows外壳扩展的一种,参照上面的程序和Delphi关于Windows的COM组件模型的编程,就可以编写出十分专业化的Windows外壳扩展程序。
2009年上半年全国计算机等级考试参考答案请进入计算机考试论坛
2009年全国计算机等级考试报名信息汇总
2009年NCRE考试有新变化
2009年全国计算机等级考试大纲
2009年上半年全国计算机二级考试试题及答案
2009年上半年全国计算机等级考试试题答案汇总