Shell-Extension & 64 Bit



  • Moin,
    ich schreibe gerade eine Shell-Extension (COM-DLL mit CLSID, Implementierung von IContextMenu etc.) für ein Projekt, die bei gewissen Dateitypen
    einen ContextMenuHandler registriert. In DllRegisterServer() lege ich folgende Registry-Schlüssel an: (Beispiel: ein Handler für alle Typen)

    [b]HKEY_CLASSES_ROOT[/b]
      [b]*[/b]
        [b]shellex[/b]
          [b]ContextMenuHandlers[/b]
            [b]MyProg[/b]
              (Default) = MyGUID
      [b]MyProg[/b]
        [b]shellex[/b]
          [b]ContextMenuHandlers[/b]
            (Default) = MyGUID
      [b]CLSID[/b]
        [b]{MyGUID}[/b]
          (Default) = MyProg
          [b]InProcServer32[/b]
            (Default) = C:\MyShellExtensionHandler.dll
            ThreadingModel = Apartment
    [b]HKEY_LOCAL_MACHINE[/b]
      [b]SOFTWARE[/b]
        [b]Microsoft[/b]
          [b]Windows[/b]
            [b]CurrentVersion[/b]
              [b]Shell Extensions[/b]
                [b]Approved[/b]
                  MyGUID = MyProg
    

    Läuft ohne Probleme unter einem 32Bit System (Getestet: XP und Vista). Unter Windows 7 64Bit wird der Menüeintrag nicht mehr angezeigt. Kann mir jemand bei dem Problem helfen?

    Mfg
    Ravendark



  • Du brauchst eine 64-Bit DLL.



  • _Luckie schrieb:

    Du brauchst eine 64-Bit DLL.

    Habe ich auch schon dran gedacht. Es gibt nur ein Problem: Ich habe zu Testzwecken eine 64Bit-DLL erstellt.
    Dann habe ich unter Windows 7 64Bit die DLL per Cmd registriert:

    C:\Windows\system32>regsvr32 C:\ShellHandler64.dll
    

    Es kommt dann die Fehlermeldung, dass DllRegisterServer() mit dem Fehlercode SELFREG_E_CLASS beendet wurde.
    Der gleiche Code, nur als 32Bit-DLL compiliert, wird mit

    C:\Windows\SysWOW64>regsvr32 C:\ShellHandler32.dll
    

    ohne Probleme registriert.



  • C:\Windows\system32>regsvr32 C:\ShellHandler64.dll
    

    Du versuchst eine 64-Bit DLL mit einem 32-Bit Programm zu registrieren? Frag dich mal, ob das klappen kann.

    C:\Windows\SysWOW64>regsvr32 C:\ShellHandler32.dll
    

    Dazu muss man wohl nichts mehr sagen. 😉



  • Das sieht schon alles richtig aus 😉

    Es gibt kein regsvr64 😉

    Bei der Registrierung ging halt wohl was schief... da kommst Du vermutlich um ein Debuggen nicht drum herum...



  • _Luckie schrieb:

    C:\Windows\system32>regsvr32 C:\ShellHandler64.dll
    

    Du versuchst eine 64-Bit DLL mit einem 32-Bit Programm zu registrieren? Frag dich mal, ob das klappen kann.

    C:\Windows\SysWOW64>regsvr32 C:\ShellHandler32.dll
    

    Dazu muss man wohl nichts mehr sagen. 😉

    http://support.microsoft.com/kb/249873/de

    Die 64-Bit-Version ist "%systemroot%\System32\regsvr32.exe".
    Die 32-Bit-Version ist "%systemroot%\SysWoW64\regsvr32.exe".

    Meine Kommandozeile ist vollkommen richtig, schonmal mit einem 64Bit System gearbeitet?
    SysWOW64 steht für "Windows on Windows 64", d.h. alle 32-Bit System-DLL's und System-Programme liegen dort. Die nativen 64Bit Programme/DLL's liegen in System32.

    @Jochen:
    Danke, werde mal meine 64Bit DLL noch mal unter die Lupe nehmen ^^
    Hast du eine Idee warum dann die 32Bit DLL unter x64 zwar erfolgreich registriert werden kann, aber kein Menüeintrag angezeigt wird?



  • Der Menü-Eintrag wird nur angezeigt, wenn Du den 32-Bit Explorer aus "syswow64" startest!!!



  • Jochen Kalmbach schrieb:

    Es gibt kein regsvr64 😉

    Womit wir wieder bei der Inkonsistenz von Microsoft wären. Ich hätte für 64-Bit jetzt regsvr64 erwartet oder nur regsvr.

    Dann nehme ich alles wieder zurück.



  • Jochen Kalmbach schrieb:

    Der Menü-Eintrag wird nur angezeigt, wenn Du den 32-Bit Explorer aus "syswow64" startest!!!

    Selbst wenn ich den Explorer aus SysWOW64 starte und meine 32Bit-DLL registriere erscheint kein Menüeintrag.
    (Laut TaskManager ist der Explorer dann trotzdem ein 64Bit-Programm)



  • Ach so... moment, ich teste mal...

    Ja, es sieht tatsächlich so aus, als ob man keinen 32-Bit explorer unter x64 zum laufen bekommt...
    Das hat ja was gutes: Du braucht keinen 32-Bit DLL registrieren 😉



  • Jochen Kalmbach schrieb:

    Das hat ja was gutes: Du braucht keinen 32-Bit DLL registrieren 😉

    Hab auch jetzt meine 64Bit-DLL zum laufen/registriert bekommen ^^ Aber der Menüeintrag fehlt immer noch...

    Kann sein das ich total auf dem Schlauch stehe: Ich benutze RegCreateKeyEx() und RegSetValueEx(), muss ich bei 64Bit einen extra Flag angeben bzw. was besonderes beachten?



  • Wenn Du eine 64-Bit DLL hast musst Du nichts besonderes beachten...
    Hast Du nachgeschaut, dass auch die Registry Einträge gesetzt sind?
    Hast Du mal unter "Senden an..." geschaut... unter Win7 hat sich da mit den Kontext-Menü Einträgen auch irgend etwas geändert...


Anmelden zum Antworten