📄 encryptmenuhandler.~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 + -