程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi深度探索之外殼執行操作記錄器(5)

Delphi深度探索之外殼執行操作記錄器(5)

編輯:Delphi

HKEY_LOCAL_MacHINE
SOFTWARE
Microsoft
Windows
CurrentVersion
Explorer
ShellExecuteHooks
{CLSID}= '描述字符串'

修改注冊表可以通過重載COM的類工廠的UpdateRegistry方法來實現。代碼示意如下:

implementation
uses ComServ, SysUtils;
resourcestring
sCreateRegKeyError = '創建注冊表項失敗';
type
 TShellExComObjectFactory = class(TComObjectFactory)
public
 procedure UpdateRegistry(Register: Boolean); override;
end;
{ TShellExComObjectFactory }
procedure TShellExComObjectFactory.UpdateRegistry(Register: Boolean);
const
 hellExecuteHooksKey='SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks';
var
 Handle: HKey;
 Status, Disposition: Integer;
 ClassID: String;
begin
 ClassID := GUIDToString(Class_TShellExecuteHook);
 if Register then
 begin
  Status := RegCreateKeyEx(HKEY_LOCAL_MacHINE, PChar(
   ShellExecuteHooksKey), 0, '',REG_OPTION_NON_VOLATILE,
   KEY_READ or KEY_WRITE, nil, Handle, @Disposition);
  if Status = 0 then
  begin
   Status := RegSetValueEx(Handle, PChar(ClassID), 0, REG_SZ,
    PChar(Description), Length(Description) + 1);
   RegCloseKey(Handle);
  end;
  end else
  begin
   Status := RegOpenKeyEx(HKEY_LOCAL_MacHINE, PChar(ShellExecuteHooksKey), 0,
    KEY_READ or KEY_WRITE, Handle);
   if Status = 0 then
   begin
    Status := RegDeleteValue(Handle, PChar(ClassID));
    RegCloseKey(Handle);
   end;
  end;
  if Status <> 0 then raise EOleError.Create(sCreateRegKeyError);
   inherited UpdateRegistry(Register);
  end;
  initialization
  TShellExComObjectFactory.Create(
   ComServer, TTShellExecuteHook, Class_TShellExecuteHook,'TShellExecuteHook',
'ShellExecute hook sample', ciMultiInstance, tmApartment);
 end.

如果系統中有多個ShellExecuteHook的話,外殼會按照ShellExecuteHook的安裝順序進行調用,如果要想使某個外殼擴展優先運行,可先刪除其他擴展然後添加優先擴展,原來的擴展依次放在後面,不過這樣做也可能意義不大,因為別人也會這麼干。最後,程序運行的結果。

記住ShellExecuteHook並不是一個完善的用於監視系統運行的擴展。它只能監視ShellExecute和ShellExecuteEx的運行,它不能保證記錄系統所有的行為。特別是很多情況下外殼並不使用ShellExecute來進行一些常用的操作,比如我們在資源管理器中選擇一個文件,然後調用右鍵菜單的屬性命令後,記錄器沒有記錄這個動作,但如果直接調用ShellExecute(如下示)的話,ShellExecuteHook卻會正確執行。

ShellExecute(nil, 'propertIEs', 'foo.txt',nil,nil,SW_SHOW);

這說明外殼並不使用ShellExecute函數顯示屬性對話框。總之一定要謹慎使用這項技術,確保它確實符合工作的需求。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved