⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encryptmenuhandler.~pas

📁 右键菜单实现文件加密
💻 ~PAS
字号:
unit EncryptMenuHandler;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Windows, ActiveX, Classes, ComObj, EncryptMenu_TLB, StdVcl,ShellAPI,SysUtils,ShlObj;

type
  TEncryptMen = class(TTypedComObject,IShellExtInit,IEncryptMen)
  protected
    function IShellExtInit.Initialize = SEIInitialize; // Avoid compiler warning
    function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
               hKeyProgID: HKEY): HResult; stdcall;
    function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,
               uFlags: UINT): HResult; stdcall;
    function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
    function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
               pszName: LPSTR; cchMax: UINT): HResult; stdcall;
    {Declare IEncryptMen methods here}
  end;
  TEncryptMenuFactory = class(TComObjectFactory)
  public
    procedure UpdateRegistry(Register: Boolean); override;
end;
const
  Class_EncryptMen : TGUID = '{ABADF666-AA68-430C-925D-30125018712E}';
implementation

uses ComServ, N3U_INIFileIO,Registry, N5U_Reg;

{ TEncryptMen }

function TEncryptMen.GetCommandString(idCmd, uType: UINT;
  pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HResult;
begin
 if (idCmd = 0) then begin
   if (uType = GCS_HELPTEXT) then
      {返回该菜单项的帮助信息,此帮助信息将在用户把鼠标移动到该菜单项时出现在状态条上。}
      StrCopy(pszName, PChar('点击该菜单项将加密选中文件'));
      Result := NOERROR;
   end
   else
      Result := E_INVALIDARG;
end;

function TEncryptMen.InvokeCommand(
  var lpici: TCMInvokeCommandInfo): HResult;
var
   sSaveFile:String;
begin
   // 首先确定该过程是被系统而不是被一个程序所调用
   if (HiWord(Integer(lpici.lpVerb)) <> 0) then
   begin
      Result := E_FAIL;
      Exit;
   end;
   // 确定传递的参数的有效性
   if (LoWord(lpici.lpVerb) <> 0) then begin
      Result := E_INVALIDARG;
      Exit;
   end;
   //file://调用文件操作程序对用户选中的文件进行操作
   sSaveFile := TReg.LoadFromReg('APPDIR')+'\Encrypt.exe';
   if sSaveFile = '' then sSaveFile := 'E:\EncryptFile\Encrypt\Encrypt.exe';
   ShellExecute(0,nil,PChar(sSaveFile),nil,nil,SW_NORMAL);
   Result := NOERROR;
end;

function TEncryptMen.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
  idCmdLast, uFlags: UINT): HResult;
begin
  Result := 0;
  if ((uFlags and $0000000F) = CMF_NORMAL) or
      ((uFlags and CMF_EXPLORE) <> 0) then
  begin
 // 往Context Menu中加入一个菜单项
    InsertMenu(Menu, indexMenu, MF_STRING or MF_BYPOSITION, idCmdFirst,PChar('文件加密'));
 // 返回增加菜单项的个数
   Result := 1;
 end;
end;

function TEncryptMen.SEIInitialize(pidlFolder: PItemIDList;
  lpdobj: IDataObject; hKeyProgID: HKEY): HResult;
var
   StgMedium: TStgMedium;
   FormatEtc: TFormatEtc;
   FileNumber,i:Integer;
   FFileName: array[0..MAX_PATH] of Char;
begin
//  //file://如果lpdobj等于Nil,则本调用失败
  if (lpdobj = nil) then
  begin
    Result := E_INVALIDARG;
    Exit;
  end;
  with FormatEtc do
  begin
    cfFormat := CF_HDROP;
    ptd := nil;
    dwAspect := DVASPECT_CONTENT;
    lindex := -1;
    tymed := TYMED_HGLOBAL;
  end;
  Result := lpdobj.GetData(FormatEtc, StgMedium);
  if Failed(Result) then Exit;
  DeleteAll('File');
  //  //file://首先查询用户选中的文件的个数
  FileNumber := DragQueryFile(StgMedium.hGlobal,$FFFFFFFF,nil,0);
//  //file://循环读取,将所有用户选中的文件保存到FileList中
  for i :=0 to FileNumber-1 do
  begin
    DragQueryFile(StgMedium.hGlobal, i, FFileName, SizeOf(FFileName));
    SetINIValue('File',FFileName,'FileName');
    Result := NOERROR;
  end;
  ReleaseStgMedium(StgMedium);
  Exit;
end;

{ TEncryptMenuFactory }

procedure TEncryptMenuFactory.UpdateRegistry(Register: Boolean);
 var//注册属性页以便同指定的文件关联//
      MyClassID:  string;
begin
  inherited  UpdateRegistry(Register);
  if  Register  then
  begin
    MyClassID:=GUIDToString(Class_EncryptMen);
    with  TRegistry.Create  do
    try
      RootKey:=HKEY_CLASSES_ROOT;
      createregkey('.th','','EncryptMen');
      createregkey('EncryptMen\shellex\EncryptMenuHandlers\'+classname,'',MyClassID);
    finally
      Free;
    end;
  end
  else
    deleteregkey('EncryptMen\shellex\EncryptMenuHandlers\'+classname);
end;

initialization
  TEncryptMenuFactory.Create(ComServer, TEncryptMen, Class_EncryptMen,
    'EncryptMenu', '',ciMultiInstance, tmApartment);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -