Benutzer mit den meisten Antworten
64-Bit Explorer Context Menü Erweiterung - C++

Frage
-
Hallo
Ich schlag mich schon seit 3 Tagen damit rum eine Windows Explorer Erweiterung zu programmieren, welche auf 64-Bit Systemen läuft.
Das ist allerdings dermassen schlecht und unvollständig erklärt, dass es zu einem wahren Albtraum wird.
Ich habe schon viele Beispiele dazu gefunden, unter anderem:
http://www.codeproject.com/KB/shell/shellextguide1.aspx#gettingstarted
http://www.codeproject.com/KB/applications/OpenFolder.aspx?fid=352353&fr=51#xx0xx
Allerdings schaff ichs bei beiden nicht die zum laufen zu bringen. Wonach ich auf der suche bin:
Ein MINIMALES Beispiel, das in EINE Datei passt, sich auf 64-Bit kompilieren und per regsvr32 registrieren lässt.
Die ganzen Registry Einträge sollen NICHT automatisch gemacht werden. Die kann ich per Installer transparent und nachvollziehbar machen. Man könnte meinen, dass es sowas geben müsste, aber ich habs bisher noch nicht gefunden.
Im Prinzip versuche ich nur bei einem Rechtsklick durch alle selektierten Dateien zu iterieren, zu schauen ob mindestens eines davon meinen Kriterien entspricht, und je nach dem das Context Menü Item anzuzeigen. Dann möchte dafür noch eine Aktion definieren. Eigentlich ja ganz simpel. Kann mir da wer helfen?
Danke vielmals!
Antworten
-
Ich benutze VS2010.
Allerdings hat sich die Sache nun erledigt. Ich hab das Projekt von hier genommen. Das funktioniert nun für 64-Bit prima. Es lässt sich aber nicht unter 32-Bit registrieren... Nichtmal die originalversion davon... Hat da jemand einen Lösungsvorschlag?
Vielen Dank!
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 12. September 2011 15:27
- Als Antwort markiert FlashFanX Montag, 12. September 2011 15:52
Alle Antworten
-
Hast Du das Projekt als 64bit Projekt umgebaut und hast es mit der 64bit Variante von REGSVR32 auch registriert?
Was hast Du im Detail für Probleme?
In den Kommentaren zu http://www.codeproject.com/KB/shell/shellextguide1.aspx findest Du auch Hinweise wie man das Projekt auf 64bit bringt (zumindest für VS-2005), IMHO waren da nur 2 Änderungen zu machen.
Du kannstmit ShellExView kontrollieren ob Deine Shell Extension wirklich registriert ist:
http://www.nirsoft.net/utils/shexview.html
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
Also den Grund wieso es nicht funktioniert kenne ich eigentlich auch nicht so genau. Ich hatte das Projekt auf 64-bit umgestellt. Beim 1. der beiden musste ich auch noch diese 2 Änderungen aus dem Kommentaren vornehmen, damit ich es kompillieren konnte.
Wenn ich es dann mittels regsvr32 (das in c:/windows/system32 auf win7 x64) registriere, bekomme ich die meldung, dass es funktioniert hat.
In der Registry werden die Einträge auch angelegt. Einer in HKCR/CLSID und einer in HKCR/*/ShellEx/ContextMenuHandlers.
Das Context Menü erscheint aber trotzdem nicht, auch wenn es richtig eingetragen wurde.
Das Projekt vom 2. Link hat auch einen Installer, welcher bei mir wunderbar funktioniert.
Wenn ich das Projekt alerdings selber builde, in dem ich es auf x64 stelle und sonst keine Änderungen vornehme und dann registriere, krieg ich das Context Menü auch nicht.
Ist irgendwie eine seltsame Geschichte...
Nichts desto trotz wäre die ganze Sache viel einfacher wenn es mal ein vernünftiges Beispiel gäbe. Ein Projekt mit 15 Dateien in denen wirres Zeug steht, ist nicht umbedingt sehr hilfreich. Wenn ich alles verstehen würde, könnte ich das locker in eine Datei kürzen. Aber dem ist leider nicht so...
UPDATE:
Das ShellExView Tool zeigt mir auch an, dass die Extension registriert ist. Hab das mal eben mit dem Projekt #1 ausprobiert.
Trotzdem erscheint das kontextmenü nicht.
- Bearbeitet FlashFanX Donnerstag, 1. September 2011 11:52
-
Hallo FlashFanx,
Kann das hier der Grund sein?
Creating Shortcut Menu Handlers („Note: There are special considerations for 64-bit Windows when registering handlers that work in the context of 32-bit applications: when Shell verbs are invoked in the context of a 32-bit application, the WOW64 subsystem redirects file system access to some paths. If your .exe handler is stored in one of those paths, it is not accessible in this context. Therefore, as a work around, either store your .exe in a path that does not get redirected, or store a stub version of your .exe that launches the real version.“)
Grüße,
Robert
-
also ich habe nun nochmal probiert projekt #1 zum laufen zu bringen.
Ich habe den code so modifiziert, dass in der DllMain bevor dem return eine datei "Init.txt" , und im Konstruktor der Klasse CSimpleShlExt eine datei "instance.txt" angelegt wird.
Wenn ich die dll registriere und dann auf irgendeine datei rechtsklicke, habe ich am schluss nur die datei "init.txt", der Konstruktor schein also nie aufgerufen zu werden, bzw wird gar nie eine Instanz der Klasse angelegt.
Woran kann das liegen?
-
Ich konnte die Sache jetzt mal debuggen, indem ich es an die explorer.exe attacht habe. In der funktion "DllGetClassObject" gibt es beim Aufruf von _Module.GetClassObject eine Exception die von der Linie 99 der Datei "atlcore.h" kommt.
Sagt das jemandem was?
-
Ich benutze VS2010.
Allerdings hat sich die Sache nun erledigt. Ich hab das Projekt von hier genommen. Das funktioniert nun für 64-Bit prima. Es lässt sich aber nicht unter 32-Bit registrieren... Nichtmal die originalversion davon... Hat da jemand einen Lösungsvorschlag?
Vielen Dank!
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 12. September 2011 15:27
- Als Antwort markiert FlashFanX Montag, 12. September 2011 15:52