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外壳扩展程序。
上一页 [1] [2]
责任编辑:小草