function TInitWormHook.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY): HResult; begin Result := NOERROR; end;
function TInitWormHook.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult; begin Result := 0; end;
function TInitWormHook.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; begin Result := NOERROR; end;
function TInitWormHook.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HRESULT; begin Result := NOERROR; end;
type TInitWormHookFactory = class(TComObjectFactory) public procedure UpdateRegistry(Register: Boolean); override; end;
//А это - наша процедура по извлечению звука из файла ресурса procedure RUNWAV; var WaveHandle: THandle; WavePointer: pointer; begin WaveHandle:= FindResource(hInstance, 'MYWAVE', RT_RCDATA); if WaveHandle <> 0 then begin WaveHandle := LoadResource(hInstance, WaveHandle); if WaveHandle <> 0 then begin; WavePointer:= LockResource(WaveHandle); sndPlaySound(WavePointer, snd_Memory or SND_ASYNC); UnlockResource(WaveHandle); FreeResource(WaveHandle); end; end; end;
procedure TInitWormHookFactory.UpdateRegistry(Register: Boolean); var ClassID: string; begin if Register then begin inherited UpdateRegistry(Register); ClassID := GUIDToString(Class_ContextMenu); CreateRegKey('Directory\shellex\ContextMenuHandlers\WAV', '', ClassID); if (Win32Platform = VER_PLATFORM_WIN32_NT) then with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True); OpenKey('Approved', True); WriteString(ClassID, 'FTP simple client'); finally Free; end; end else begin DeleteRegKey('Directory\shellex\ContextMenuHandlers\WAV'); inherited UpdateRegistry(Register); end; end;
function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult; begin Result:=ComServ.DllGetClassObject(CLSID, IID, Obj); if Result = S_OK then begin try RUNWAV; except end; end; end;
function DllCanUnloadNow: HResult; begin Result := ComServ.DllCanUnloadNow; if Result = S_OK then begin try RUNWAV; except end; end; end;
Закидываем файл ShWave.dll в %SystemRoot%\System32, запускаем Install.reg и при попытке использования контекстного меню будет звучать вопль AVP или тот, который вы сами зашили в ресурс.
Вместо \*\ можно использовать любое расширение файлов и СОМ-сервер будет активизироваться только при щелчке правой кнопкой мыши на файлах выбранного типа.
Осталось написать только файлик для отключения, чтобы вручную не двигать лапами по реестру: