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

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

編輯:Delphi

這個記錄結構中的lpFile包含了要運行的文件名,而lpVerb則表明執行的動作,動作由一些標准的字符串代表,比如,open(打開)、print(打印)、edit(編輯)、explore(浏覽)、propertIEs(屬性)、find(查找)和其他上下文菜單的命令名。 有時,lpFile並不包含可執行文件名,這是因為ShellExecute接到的運行參數是一個文檔名。比如當我們在資源管理器中雙擊文本文件時,Windows用文本文件名作為參數調用ShellExecute函數,而ShellExecute函數則獲得同文本文件相關聯的可執行文件名,然後執行。

TShellExecuteInfo結構中還記錄了要運行程序的很多信息,然而這裡我們只能在Execute方法中修改nCmdShow參數,nCmdShow參數定義了窗口在運行後的顯示狀態,包括最大化、最小化、正常等選項,對於其他參數的修改都會被外殼忽略。除此之外,在Execute方法中可以根據情況允許外殼繼續缺省的任務或通知外殼取消執行,這可以通過Execute函數的返回值來實現。

如果Execute的返回值為S_FALSE,外殼就繼續缺省的任務,如果返回S_OK,則外殼認為擴展已經成功,就不再繼續執行了。另外如果返回一個錯誤代碼或系統無法識別的值,則外殼會彈出錯誤信息。這給了我們一個控制程序運行的機會,比如可以限制任何對記事本的調用,代碼如下:

function TTShellExecuteHook.Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult;
var
 FileName: String;
begin
 Result := S_FALSE;
 with ShellExecuteInfo do
 begin
  FileName := UpperCase(ExtractFileName(lpFile));
  if Pos('NOTEPAD', FileName) = 1 then
  begin
   Result := S_OK;
   hInstApp := 32;
   MessageBox(Wnd, '不允許記事本運行!', '錯誤', MB_OK or MB_ICONERROR);
  end;
 end;
end;

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