Расширь контекст Алексей Соколов aka Aggressor Хакер, номер #089, стр. 089-112-3 Procedure BlockRead(var F: File; var Buf; Count: Integer[; var Result: Integer]); Procedure BlockWrite(var F: File; var Buf; Count: Integer[; var Result: Integer]); F – переменная нетипизированного файла, Buf – переменная, где хранится прочитанные данные, Count – количество записей, которые нужно считать (в нашем случае 1), Result означает, сколько на самом деле записей было прочитано/записано. Впрочем, все лучше увидеть на примере: procedure Shifr (FFileName: string); // FFileName – это имя файла, которое будем шифровать var F: File; BRead, BWritten, TotalRead : Integer; Buf: Byte; begin AssignFile(F,FFileName); Reset(F,1); // открываем для чтения/записи try TotalRead:=0; // количество всех прочитанных байт repeat // считываем в Buf 1 байт из F BlockRead(F,Buf, 1, BRead); if BRead > 0 then begin // ставим указатель перед последним прочитанным байтом seek(F,TotalRead); Buf:=Buf xor 7; // ксорим семеркой BlockWrite(F,Buf, BRead, BWritten); // записываем уже зашифрованный байт if BRead <> BWritten then // если количествово прочитанных байт <> количествуву записанных raise Exception.Create('Ошибка при шифровании!') else begin TotalRead:= TotalRead + BRead; end; end; until BRead=0; finally CloseFile(F); end; Реализуем все прочитанное Теперь мы разобрали все необходимое, поэтому я предлагаю открыть пример расширения контекстного меню из поставки Delphi (Borland\Delphi7\Demos\ActiveX\ShellExt\contmenu.dpr) и отредактировать его. Для начала в Class_ContextMenu изменим значение TGUID на любое другое. В TContextMenu.QueryContextMenu пункт InsertMenu 'Compile...' меняем на название нашего пункта, то есть "Зашифровать". Далее идет GetCompilerPath. Эту функцию благополучно удаляем, и на ее место вставляем нашу — Shifr. Как известно, TContextMenu.InvokeCommand выполняется после нажатия на наш пункт в меню, поэтому мы здесь напишем только Shifr (FFileName), а остальное удалим :). Ну, с TContextMenu.GetCommandString тоже все ясно, так что оставляем без изменений. А вот TContextMenuFactory.UpdateRegistry нужно подправить: просто все пути в реестре меняем на свои. Вот и все, делать больше нечего... теперь компилируем и получившуюся DLL кидаем, например, в C:\WINDOWS\system32. А что дальше? А дальше запускаем cmd, набираем Regsvr32 C:\WINDOWS\system32\ContMenu.dll — и наше расширение готово к работе! Для того чтобы отменить регистрацию, достаточно выполнить Regsvr32 /u C:\WINDOWS\system32\ContMenu.dll. Открываем любую папку, щелкаем по любому файлу — и любуемся новым пунктом в меню! Вот таким несложным образом можно добавить свой пункт в любой тип файлов. А если хочется и иконку добавить рядом с пунктом (как у WINRAR), то для этого нужно использовать не только IContextMenu, но и IContextMenu3. Вот, собственно, и все. Если что-то непонятно, то пиши на мыло. Уникальные идентификаторы GUID представляет некоторое 128-разрядное целое число, используемое в технологии COM для уникальной идентификации интерфейсов. GUID генерируется при помощи API-функции CoCreateGUID(), а алгоритм генерации нового GUID основывается на комбинации следующей информации: текущая дата и время, частота процессора, номер сетевой карты. Если на компьютере установлена сетевая карта, то сгенерированный на этом компьютере GUID будет действительно уникальным, так как уникальность сетевой карты гарантируется встроенным в нее глобальным идентификатором (ID). Если же на компьютере нет сетевой карты, то ее номер можно заменить другим, синтезировав его с помощью параметров другого установленного в компьютере оборудования. |