這個記錄結構中的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;