Современные решения

для защиты Windows приложений

и восстановления исходного кода
АвтъA: C Pringle. Дат? ??бликации: 22.08.2004

При??? добавлен?? ??ыIта ? ??ыQекстыM? ???? Windows Explorer



CODE NOW!

// Откройт? Delphi, выберите ? ???? New... Dynamic link library
// С????руйт? ыGже??иведеныZ? те??? DLL
// С????илируйте ??ьD??.
// Тепер? ыRжн? зарегистрировать ????чеыL?? библиоте??.
// Наберит? ? ????ыCыM? стро?? regsvr32.exe sendtoweb.dll
// ПъB?? ?того ъC??ьHте Windows Explorer ? вы увидит? ыMвы?
// ??ыI? ????...

unit Sendtoweb;

// Author C Pringle Cjpsoftware.com

{ Реа??заци? COM ь@ъе??? расширен?? ь@ьJъH?? Windows Explorer. Это?
COM ь@ъе?? спъBь@ен ??реъь??ав??ть за??ъB? ??????енту TPopupMenu. КьK??ыDыQ
TPopupMenu до??ен ъьходить?? ъь форм? MenuComponentForm.
В? ??жете ??дернизирьAат? ??? дл? бо??ше? гибкъBти.

КьK??ыDыQ TContextMenu регистрирует?? ??? гль@ал??ым ь@работчик
??ыQекстыMго ????. Это достигаетс? ??дифи??цией ???ча реестр?
HKEY_CLASSES_ROOT\*\ShellEx\ContextMenuHandlers.

jfl
}

interface

uses

Classes, ComServ, ComObj, ActiveX, Windows, ShlObj, Interfaces, Menus,
ShellAPI, SysUtils, registry;

type
TContextMenuFactory = class(TComObjectFactory)
public
procedure UpdateRegistry(Register: Boolean); override;
end;

TContextMenu = class(TComObject, IShellExtInit, IContextMenu)
private
FFileName: string;
function BuildSubMenu(Menu: HMENU; IndexMenu: Integer;
var IDCmdFirst: Integer): HMENU;
protected
szFile: array[0..MAX_PATH] of Char;
// НеобхьCим? дл? ис???чеыG? ??едупрежден?? ????ил?тора ? ыDьCыMзначыMст?
function IShellExtInit.Initialize = IShellExtInit_Initialize;
public
{ IShellExtInit }
function IShellExtInit_Initialize(pidlFolder: PItemIDList; lpdobj:
IDataObject;
hKeyProgID: HKEY): HResult; stdcall;
{ IContextMenu }
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;
end;

var
// ДьJже? быть инициа??зирова? ??ре? регистрацией TContextMenu!
GFileExtensions: TStringList;

const
MenuCommandStrings: array[0..3] of string = (
'', '&STW Web Upload', '&STW FTPClient', '&STW Setup'
);

implementation

{ TContextMenuFactory }
{ Public }

function ReadDefaultPAth: string;
var
path: string;
Reg: TRegistry;
begin

Reg := TRegistry.CReate;
try
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE;
Path := 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths';

if KeyExists(Path) then
begin
OpenKey(Path + '\sendtoweb.exe', false);
Result := ReadString(#0);
closekey;
end;

// К??? добавлен ? реестр.

end;
finally
Reg.CloseKey;
Reg.Free;
end;

end; // КьC регистраци?

procedure TContextMenuFactory.UpdateRegistry(Register: Boolean);
begin
inherited UpdateRegistry(Register);

// Регистрац?? ъьшего ь@работчик?
if Register then
begin
CreateRegKey('*\ShellEx\ContextMenuHandlers\SendToWeb', '',
GUIDToString(Class_ContextMenu));
CreateRegKey('CLSID\' + GUIDToString(ClassID) + '\' +
ComServer.ServerKey, 'ThreadingModel', 'Apartment');
end
else
begin
DeleteRegKey('*\ShellEx\ContextMenuHandlers\SendToWeb');
end;
end;

{ TContextMenu }
{ Private }

{ ПъBтрьDыG? ??ыQекстыMго ???? ? ис????зоваыGем ??ыC?? существу?щего ????.
Есл? Menu = nil, ?? создае? ыMвы? ??ыC? ???? ? возвращаем ег? ??? резу??та?
фуыIци?. Замет???, чт? ь@работчик ыD ??ддерживаетвльEеныZ? (ре??рсивыZ?)
????. }

function TContextMenu.BuildSubMenu(Menu: HMENU; IndexMenu: Integer;
var IDCmdFirst: Integer): HMENU;
var
i: Integer;
menuItemInfo: TMenuItemInfo;
begin
if Menu = 0 then
Result := CreateMenu
else
Result := Menu;

// ПьCготавливае? ????
with menuitemInfo do
begin
cbSize := SizeOf(TMenuItemInfo);
fMask := MIIM_CHECKMARKS or MIIM_DATA or MIIM_ID or
MIIM_STATE or MIIM_SUBMENU or MIIM_TYPE or MIIM_CHECKMARKS;
fType := MFT_STRING;
fState := MFS_ENABLED;
hSubMenu := 0;
hbmpChecked := 0;
hbmpUnchecked := 0;
end;

for i := 0 to High(MenuCommandStrings) do
begin
if i = 0 then
menuitemInfo.fType := MFT_SEPARATOR
else
menuiteminfo.ftype := MFT_String;
if i = 1 then
menuitemInfo.fstate := MFS_ENABLED or MFS_DEFAULT
else
menuitemInfo.fstate := MFS_ENABLED;

menuitemInfo.dwTypeData := PChar(MenuCommandStrings[i]);
menuitemInfo.wID := IDCmdFirst;
InsertMenuItem(Result, IndexMenu + i, True, menuItemInfo);
Inc(IDCmdFirst);
end;
end;

{ IShellExtInit }

function TContextMenu.IShellExtInit_Initialize(pidlFolder: PItemIDList;
lpdobj: IDataObject; hKeyProgID: HKEY): HResult;
var
medium: TStgMedium;
fe: TFormatEtc;

begin
with fe do
begin
cfFormat := CF_HDROP;
ptd := nil;
dwAspect := DVASPECT_CONTENT;
lindex := -1;
tymed := TYMED_HGLOBAL;
end;
// Ошибк?, ес?? lpdobj = Nil.
if lpdobj = nil then
begin
Result := E_FAIL;
Exit;
end;
Result := lpdobj.GetData(fe, medium);
if Failed(Result) then
Exit;
// Есл? выбран то???? ьCин файл, ????чаем ег? им? ? сохран?ем ?
// szFile. инач? - ъIиб??.
if DragQueryFile(medium.hGlobal, $FFFFFFFF, nil, 0) = 1 then
begin
DragQueryFile(medium.hGlobal, 0, szFile, SizeOf(szFile));
Result := NOERROR;
end
else
Result := E_FAIL;
ReleaseStgMedium(medium);
end;

{ IContextMenu }

function TContextMenu.QueryContextMenu(Menu: HMENU;
indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult;
var
extension: string;
I: Integer;
idLastCommand: Integer;
begin
Result := E_FAIL;
idLastCommand := idCmdFirst;

// ПьJучае? расширение файл? ? ъ@реде??ем, есть ?? дл? ыDго
// зарегистрироваыLый ь@работчик
// extension := UpperCase( ( FFileName ) );

//for i := 0 to GFileExtensions.Count - 1 do
// if Pos(Lowercase(GFileExtensions[ i ]),lowercase(extension))=0 then
// begin
BuildSubMenu(Menu, indexMenu, idLastCommand);
// Return value is number of items added to context menu
Result := idLastCommand - idCmdFirst;
// Exit;
// end;
end;

function TContextMenu.InvokeCommand(var lpici:
TCMInvokeCommandInfo): HResult;
var
idCmd: UINT;
begin
if HIWORD(Integer(lpici.lpVerb)) <> 0 then
Result := E_FAIL
else
begin
idCmd := LOWORD(lpici.lpVerb);
Result := S_OK;

// А??ивизац?? диальB? ? ??дгъCьA?? ? ??сл?? даыLых ? Web

case idCmd of
1:
begin

ShellExecute(GetDesktopWindow, nil,
Pchar(ExtractFileName(ReadDefaultPath)),
Pchar('Direct' + '"' + szfile + '"'), nil, SW_SHOW);

end;
3:
begin
ShellExecute(GetDesktopWindow, nil,
Pchar(ExtractFileName(ReadDefaultPath)),
Pchar('Path'), nil, SW_SHOW);

end;
2:
ShellExecute(GetDesktopWindow, nil,
Pchar(ExtractFileName(ReadDefaultPath)),
PChar(''), nil, SW_SHOW);
else
Result := E_FAIL;
end;
end;
end;

function TContextMenu.GetCommandString(idCmd, uType: UINT;
pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HResult;

begin
// StrCopy( pszName, 'Send To The Web') ;

Result := S_OK;
end;

initialization
{ Замет???, чт? ? даыLьK фраг??ыQ? ?? создае? ???ем???? TContextMenuFactory,
? ыD TComObjectFactory. }
TContextMenuFactory.Create(ComServer, TContextMenu, Class_ContextMenu,
'ContextMenu', 'Send To The Web', ciMultiInstance);

// ИыGциализируе? списьI расширений
GFileExtensions := TStringList.Create;
// GFileExtensions.Add( 'setup msn' );

finalization
GFileExtensions.Free;
end.






Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий: