Windows-Suchmaschine


Implementieren von Shell Suche Handler mit Delphi

Die Shell unterstützt mehrere Suche-Dienstprogramme, mit denen Anwender, Namespace-Objekte wie Dateien oder Drucker zu suchen. Sie können eine benutzerdefinierte Suchmaschine erstellen und es Benutzern zur Verfügung stellen indem Sie implementieren und registriert einen Handler Suche.

Benutzer haben zwei Möglichkeiten, eine Suchmaschine auswählen. Die erste Möglichkeit ist über das Startmenü. Mit Systemen auswählen als Microsoft Windows 2000, das Find-Kommando auf der Start-Menü zeigt ein Untermenü der verfügbaren Suchmaschinen. Mit Windows 2000 oder später umbenannt das Startmenü suchen Befehl ist Suche.

Benutzer können auch eine Suche über den Windows Explorer starten. Auf Systemen klicken als Windows 2000, sie den Befehl Suchen im Menü Extras im Wesentlichen das gleiche Menü wie die zugeordnete im Startmenü angezeigt. Windows Explorer für Windows 2000 verarbeitet jedoch Suchmaschinen in eine ganz andere Weise. Anstatt zu behandeln Suchmaschinen als Untermenü des Menüs Extras, gibt es jetzt eine Suchen-Schaltfläche auf der Symbolleiste. Dieser Button öffnet den Explorer Bar der Suchbereich

Das folgende Beispiel veranschaulicht die Shell Suche Handler mit Borland Delphi implementieren. Als Shell-Erweiterung muss es als in-Prozess-Component Object Model (COM)-Objekt implementiert werden. Es muss eine globally unique Identifier (GUID) zugewiesen werden und mithilfe von regsvr32.exe registriert

library SearchHandler;
uses
ComServ,
HandlerM in 'HandlerM.pas';
{$R *.RES}
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
begin
end
.

{*****************************************************************************
Name : TSearchEngine
Author : Perevoznyk Serhiy
Description : Shell Search Handler
*****************************************************************************}
unit HandlerM;
interface
uses
Windows, ActiveX, ComObj, ShlObj, Dialogs;
type
TSearchEngine = class(TComObject, IShellExtInit, IContextMenu)
protected
{ IShellExtInit }
function IShellExtInit.Initialize = SEIInitialize; // Avoid compiler warning
function SEIInitialize(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;
const
Class_SearchEngine: TGUID = '{B8091A44-1F5E-4EFE-8F26-194ACBDE4465}';
implementation
uses
ComServ, SysUtils, ShellApi, Registry;
function TSearchEngine.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
hKeyProgID: HKEY): HResult;
begin
Result := NOERROR;
end;
function TSearchEngine.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
idCmdLast, uFlags: UINT): HResult;
begin

Result := 0;
end;

function TSearchEngine.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
begin
//enter your code here
ShowMessage('Executed');
Result := NOERROR;
end;
function TSearchEngine.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
pszName: LPSTR; cchMax: UINT): HRESULT;
begin
if
(idCmd = 0) then
begin
if
(uType = GCS_HELPTEXT) then
// return help string for menu item
StrCopy(pszName, 'Find document');
Result := NOERROR;
end
else
Result := E_INVALIDARG;
end;
type
TSearchEngineFactory = class(TComObjectFactory)
public
procedure
UpdateRegistry(Register: Boolean); override;
end;

procedure CreateKey(const Key, ValueName, Value: string);
var
Handle: HKey;
Status, Disposition: Integer;
begin
Status := RegCreateKeyEx(HKEY_LOCAL_MACHINE, PChar(Key), 0, '',
REG_OPTION_NON_VOLATILE, KEY_READ or KEY_WRITE, nil, Handle,
@Disposition);
if Status = 0 then
begin
RegSetValueEx(Handle, PChar(ValueName), 0, REG_SZ,
PChar(Value), Length(Value) + 1);
RegCloseKey(Handle);
end;
end;

procedure DeleteKey(const Key: string);
begin
RegDeleteKey(HKEY_LOCAL_MACHINE, PChar(Key));
end;
procedure TSearchEngineFactory.UpdateRegistry(Register: Boolean);
var
ClassID: string;
FileName: array [0..MAX_PATH] of Char;
begin
if Register then
begin
inherited
UpdateRegistry(Register);
ClassID := GUIDToString(Class_SearchEngine);
GetModuleFileName(HInstance, FileName, SizeOf(FileName));
CreateKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler'
, '', ClassID);
CreateKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler\0'
, '', 'Using Delphi...');
CreateKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler\0\DefaultIcon'
, '', FileName + ',0');
end
else
begin
DeleteKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'
FindExtensions\Static\SearchHandler\0\DefaultIcon');
DeleteKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler\0'
);
DeleteKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler'
);
inherited UpdateRegistry(Register);
end;
end;
initialization
TSearchEngineFactory.Create(ComServer, TSearchEngine, Class_SearchEngine,
'', 'Delphi Search Engine Example', ciMultiInstance,
tmApartment);
end.









Windows-Suchmaschine


Windows-Suchmaschine : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Implementieren von Shell Suche Handler mit Delphi

Die Shell unterstützt mehrere Suche-Dienstprogramme, mit denen Anwender, Namespace-Objekte wie Dateien oder Drucker zu suchen. Sie können eine benutzerdefinierte Suchmaschine erstellen und es Benutzern zur Verfügung stellen indem Sie implementieren und registriert einen Handler Suche.

Benutzer haben zwei Möglichkeiten, eine Suchmaschine auswählen. Die erste Möglichkeit ist über das Startmenü. Mit Systemen auswählen als Microsoft Windows 2000, das Find-Kommando auf der Start-Menü zeigt ein Untermenü der verfügbaren Suchmaschinen. Mit Windows 2000 oder später umbenannt das Startmenü suchen Befehl ist Suche.

Benutzer können auch eine Suche über den Windows Explorer starten. Auf Systemen klicken als Windows 2000, sie den Befehl Suchen im Menü Extras im Wesentlichen das gleiche Menü wie die zugeordnete im Startmenü angezeigt. Windows Explorer für Windows 2000 verarbeitet jedoch Suchmaschinen in eine ganz andere Weise. Anstatt zu behandeln Suchmaschinen als Untermenü des Menüs Extras, gibt es jetzt eine Suchen-Schaltfläche auf der Symbolleiste. Dieser Button öffnet den Explorer Bar der Suchbereich

Das folgende Beispiel veranschaulicht die Shell Suche Handler mit Borland Delphi implementieren. Als Shell-Erweiterung muss es als in-Prozess-Component Object Model (COM)-Objekt implementiert werden. Es muss eine globally unique Identifier (GUID) zugewiesen werden und mithilfe von regsvr32.exe registriert

library SearchHandler;
uses
ComServ,
HandlerM in 'HandlerM.pas';
{$R *.RES}
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
begin
end
.

{*****************************************************************************
Name : TSearchEngine
Author : Perevoznyk Serhiy
Description : Shell Search Handler
*****************************************************************************}
unit HandlerM;
interface
uses
Windows, ActiveX, ComObj, ShlObj, Dialogs;
type
TSearchEngine = class(TComObject, IShellExtInit, IContextMenu)
protected
{ IShellExtInit }
function IShellExtInit.Initialize = SEIInitialize; // Avoid compiler warning
function SEIInitialize(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;
const
Class_SearchEngine: TGUID = '{B8091A44-1F5E-4EFE-8F26-194ACBDE4465}';
implementation
uses
ComServ, SysUtils, ShellApi, Registry;
function TSearchEngine.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
hKeyProgID: HKEY): HResult;
begin
Result := NOERROR;
end;
function TSearchEngine.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
idCmdLast, uFlags: UINT): HResult;
begin

Result := 0;
end;

function TSearchEngine.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
begin
//enter your code here
ShowMessage('Executed');
Result := NOERROR;
end;
function TSearchEngine.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
pszName: LPSTR; cchMax: UINT): HRESULT;
begin
if
(idCmd = 0) then
begin
if
(uType = GCS_HELPTEXT) then
// return help string for menu item
StrCopy(pszName, 'Find document');
Result := NOERROR;
end
else
Result := E_INVALIDARG;
end;
type
TSearchEngineFactory = class(TComObjectFactory)
public
procedure
UpdateRegistry(Register: Boolean); override;
end;

procedure CreateKey(const Key, ValueName, Value: string);
var
Handle: HKey;
Status, Disposition: Integer;
begin
Status := RegCreateKeyEx(HKEY_LOCAL_MACHINE, PChar(Key), 0, '',
REG_OPTION_NON_VOLATILE, KEY_READ or KEY_WRITE, nil, Handle,
@Disposition);
if Status = 0 then
begin
RegSetValueEx(Handle, PChar(ValueName), 0, REG_SZ,
PChar(Value), Length(Value) + 1);
RegCloseKey(Handle);
end;
end;

procedure DeleteKey(const Key: string);
begin
RegDeleteKey(HKEY_LOCAL_MACHINE, PChar(Key));
end;
procedure TSearchEngineFactory.UpdateRegistry(Register: Boolean);
var
ClassID: string;
FileName: array [0..MAX_PATH] of Char;
begin
if Register then
begin
inherited
UpdateRegistry(Register);
ClassID := GUIDToString(Class_SearchEngine);
GetModuleFileName(HInstance, FileName, SizeOf(FileName));
CreateKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler'
, '', ClassID);
CreateKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler\0'
, '', 'Using Delphi...');
CreateKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler\0\DefaultIcon'
, '', FileName + ',0');
end
else
begin
DeleteKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'
FindExtensions\Static\SearchHandler\0\DefaultIcon');
DeleteKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler\0'
);
DeleteKey('Software\Microsoft\Windows\CurrentVersion\Explorer\' +
'FindExtensions\Static\SearchHandler'
);
inherited UpdateRegistry(Register);
end;
end;
initialization
TSearchEngineFactory.Create(ComServer, TSearchEngine, Class_SearchEngine,
'', 'Delphi Search Engine Example', ciMultiInstance,
tmApartment);
end.


Windows-Suchmaschine

Windows-Suchmaschine : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Windows-Suchmaschine
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung