Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Registry: Explorer Kontextmenü zeigt sich nicht (https://www.delphipraxis.net/150307-registry-explorer-kontextmenue-zeigt-sich-nicht.html)

martinf16 13. Apr 2010 12:29


Registry: Explorer Kontextmenü zeigt sich nicht
 
Hallo,

seit Tagen bin ich schon am probieren, einen Kontextmenü Eintrag im Explorer zu erzeugen, das alle Dateien mit meinem Programm verknüpft. Mein bisher bester Ansatz ist folgender:

Delphi-Quellcode:
//GUID_TTestContextMenuShellExt ist als Konstante definiert
  ClassID := GUIDToString(GUID_TTestContextMenuShellExt);

//* für alle Dateien
  CreateRegKey('*\Shellex\ContextMenuHandlers\TestName', '', ClassID);

//das hatten alle Scripts, die ich mir dazu angesehen habe. Aber wozu?!
  if (Win32Platform = VER_PLATFORM_WIN32_NT) then
  with TRegistry.Create do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True);
    OpenKey('Approved', True);
    WriteString(ClassID, 'TestName');
  finally
    Free;
  end;

  reg:=TRegistry.Create();
  Reg.RootKey:=HKEY_CLASSES_ROOT;

//Name des Eintrags, der im Kontextmenü erscheinen soll
  Reg.OpenKey('*\Shellex\ContextMenuHandlers\TestName',true);
  Reg.WriteString('','Titel des Eintrags');
  Reg.CloseKey;

//Dateien sollen mit dem Programm geöffnet werden
//Ich habe auch schon probiert mit command oder shell\open\command
  Reg.OpenKey('*\Shellex\ContextMenuHandlers\TestName\open\command',true);
  Reg.WriteString('', Format('"%s" "%s"', [ParamStr(0), '%1']));
  Reg.CloseKey;

  reg.free;

  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
Die entsprechenden Keys werden auch alle erzeugt, aber leider erscheint nichts im Kontextmenü. Ich denke es muss sich um eine kleine Korrektur handeln, da ich mich aber nicht so gut mit der Registry auskenne, fällt sie mir nicht ein. Es wäre sehr lieb, wenn ihr mir etwas helfen könntet.

Luckie 13. Apr 2010 12:40

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
Und wo ist die Verknüpfung zwischen deinem Menüeintrag und der ClassID unter SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions?

Guck dir doch mal an, wie die anderen Einträge dort alle aussehen. Fällt dir da was auf?

martinf16 13. Apr 2010 12:57

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
Zitat:

Zitat von Luckie
Und wo ist die Verknüpfung zwischen deinem Menüeintrag und der ClassID unter SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions?

Guck dir doch mal an, wie die anderen Einträge dort alle aussehen. Fällt dir da was auf?

Hmm.. Also ich sehe in RegEdit jetzt nur die ClassID und eine Beschreibung?! Oder wie meinst du das?! Da muss ja irgendeine Verknüpfung fehlen, sonst würde es ja funktionieren. Aber ich weiß nicht, wie man so eine Verknüpfung herstellen kann..

Luckie 13. Apr 2010 13:09

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
Richtig und was schreibst du anstelle der ClassID dahin:
Delphi-Quellcode:
Reg.OpenKey('*\Shellex\ContextMenuHandlers\TestName',true);
Reg.WriteString('','Titel des Eintrags');

himitsu 13. Apr 2010 13:13

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
in "*\shellex\ContextMenuHandlers\myname" werden die ClassIDs "registrierter" ContextMenu-Handler (meißt DLLs) angegeben

in "*\shell\myname" kannst du direkt eine Exe verknüpfen (hierfür gibt es in der DP auch mehrere Beispiele zu finden)

Luckie 13. Apr 2010 13:15

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
Zitat:

Zitat von himitsu
in "*\shellex\ContextMenuHandlers\myname" werden die ClassIDs "registrierter" ContextMenu-Handler (meißt DLLs) angegeben

Ich gehe mal davon aus, dass er eine Shellextension hat.

martinf16 13. Apr 2010 18:07

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
Zitat:

Zitat von Luckie
Richtig und was schreibst du anstelle der ClassID dahin:
Delphi-Quellcode:
Reg.OpenKey('*\Shellex\ContextMenuHandlers\TestName',true);
Reg.WriteString('','Titel des Eintrags');

Also müsste ich hier die ClassID hinschreiben oder wie?! Also so:

Delphi-Quellcode:
Reg.OpenKey('*\Shellex\ContextMenuHandlers\TestName',true);
Reg.WriteString('',ClassID);
Zitat:

Zitat von himitsu
in "*\shellex\ContextMenuHandlers\myname" werden die ClassIDs "registrierter" ContextMenu-Handler (meißt DLLs) angegeben

in "*\shell\myname" kannst du direkt eine Exe verknüpfen (hierfür gibt es in der DP auch mehrere Beispiele zu finden)

Das verknüpfen einer EXE unter *\shell\name war kein Problem und funktionierte auch. Dabei wurde das Programm nur jedes Mal neu geöffnet und ich habe gelesen, dass wenn man *\shellex\... benutzt dieses Problem nicht besteht. Deswegen wollte ich eine Verknüpfung mit einer EXE ins *\Shellex\ContextMenuHandlers\ schreiben.

Zitat:

Zitat von Luckie
Ich gehe mal davon aus, dass er eine Shellextension hat.

Was meinst du damit genau?! Also ich habe keine DLL oder dergleichen. Ich möchte nur dass ein Kontext Menü im Exlporer erscheint, das die Dateien mit meinem Programm öffnet und den Parameter %1 dabei übergibt. Also so, wie es auch mit *\Shell\Name gehen würde. Allerdings sollen eben auch mehrere Dateien gleichzeitig übertragen werden können. Oder geht das bei *\ShellEx\ContextMenuHandlers nur mit einer DLL-Verknüpfung?

himitsu 13. Apr 2010 18:22

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
Bauplan für einen "richtigen" ContextMenuHanlder:
http://www.experts-exchange.com/Prog..._10075157.html

Du erstellst ein Interface IContextMenu, erstellst dafür eine DLL, registrierst diese DLL bei Windows und gibst dann deine Interface-ID bei Shellex\ContextMenuHandlers an.



Mehr zu den anderen ContextMenuEinträgen:
http://msdn.microsoft.com/en-us/library/cc144171.aspx



Wenn eine Anwendung mehrmals geladen wird, aber alles nur in Einer verarbeitet werden soll,
dann schau bei Programmstart nach, ob diese Anwendung/EXE schonmal gestartet wurde und übergib dieser die nötigen Informationen.
> z.B. Hier im Forum suchenOneInstance

martinf16 13. Apr 2010 21:06

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
Okay.. Schon mal vielen Dank, das sieht ja schon mal ganz gut aus. Eine DLL wollte ich eigentlich nicht mitliefern, daher bleiben eigentlich nur noch die beiden anderen Möglichkeiten (OneInstance und gemeinsame Übergabe). Die Seite von Microsoft sieht auch sehr vielversprechend aus, die werd ich mir mal in Ruhe ansehen müssen. Aber prinzipiell meint ihr geht mein Vorhaben, bei *\Shellex\ContextMenuHandlers\ mein Programm ohne DLL einzutragen oder???

Luckie 13. Apr 2010 21:52

Re: Registry: Explorer Kontextmenü zeigt sich nicht
 
Was hast du gegen die DLL? Ein Beispiel hätte ich noch auf meiner Seite: http://www.michael-puff.de/Developer/Delphi/Programme -> ExifReader1_1.zip


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz