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 shell extension - unregister / unload (https://www.delphipraxis.net/119826-shell-extension-unregister-unload.html)

xineohp 1. Sep 2008 18:33


shell extension - unregister / unload
 
Hi,

ich bin dabei eine Kontextmenü-Erweiterung für den Windows Explorer zu schreiben. Dabei ist mir aufgefallen, dass nach der Deregistrierung mit regsvr32.exe /u XYZ.dll die DLL immernoch gesperrt ist und weiterhin vom Explorer genutzt wird, obwohl der Kontextmenü-Eintrag nicht mehr angezeit wird. Mach ich da was falsch oder gibt es da einen "unload" Befehl den ich nicht kenne oder hilft da wirklich nur das Neustarten des Explorer-Prozesses?

Vielen Dank für Eure Hilfe,

Apollonius 1. Sep 2008 18:36

Re: shell extension - unregister / unload
 
Lass dir mal bei jedem AddRef und jedem Release eine Nachricht anzeigen. Dann siehst du, ob dein Objekt noch referenziert wird. Es muss allerdings nicht der Explorer schuld sein! Es kann leicht passieren, dass du selbst eine Referenz auf dein Objekt hältst, was das Entladen verhindert.

xineohp 1. Sep 2008 18:48

Re: shell extension - unregister / unload
 
hm, ich bin mir nicht sicher, ob ich deine Antwort verstehe ... Wie/Wo finde ich AddRef bzw. Release?
ich habe in meiner DLL ein TComObject und eine TComObjectFactory. Und (de-)registrieren tue ich mit regsvr32.exe. Und der Prozess der die DLL blockiert ist die explorer.exe

Apollonius 1. Sep 2008 18:53

Re: shell extension - unregister / unload
 
Überschreibe die Funktionen ObjAddRef und ObjRelease des Objektes. Dort rufst du zunächst die geerbte Implementierung auf und lässt dir dann eine Nachricht anzeigen.

xineohp 1. Sep 2008 19:31

Re: shell extension - unregister / unload
 
Ok, ich erhalte drei Add und drei Release und zwar in folgender Reihenfolge:

RKlick - Add - Add - Add - Release -Release - Menü - Release

Wie gehts weiter?

teebee 1. Sep 2008 19:44

Re: shell extension - unregister / unload
 
Zitat:

Zitat von xineohp
Mach ich da was falsch oder gibt es da einen "unload" Befehl den ich nicht kenne oder hilft da wirklich nur das Neustarten des Explorer-Prozesses?

Nein, Du machst nichts falsch, der Explorer behält einen einmal geladenen Handler permanent im Speicher. Man kann versuchen, ihn mit dem Wert AlwaysUnloadDLL=1 in HKLM\Software\Microsoft\Windows\Current Version\Explorer zu "überreden", den Handler doch zu entladen, muss aber nicht klappen.

Bei mir hilft nur, den Explorer immer neu zu starten, kann man auch mit einem kleinen Programm machen, dann ist es nicht so lästig.

Gruß
teebee

xineohp 1. Sep 2008 20:14

Re: shell extension - unregister / unload
 
ok, danke

SirThornberry 2. Sep 2008 06:10

Re: shell extension - unregister / unload
 
was bei sowas hilft ist den eigentlichen Programmcode in eine weitere Datei zu packen. Normal sieht es ja so aus:
Explorer<->deine Extension

wenn der Explorer deine Extension nicht frei gibt hast du also pech. Um nicht erst den Explorer beenden zu müssen um die Extension neu kompilieren zu können könnte man es so machen.

Explorer<->Zwischenschicht<->dll

Du bauchst dir also eine Extension (Zwischenschicht) welche nicht den eigentlichen Programmcode enhält sondern eine weitere dll lädt und daraus funktionen aufruft.

ralfiii 2. Sep 2008 10:40

Re: shell extension - unregister / unload
 
Zitat:

Zitat von xineohp
hilft da wirklich nur das Neustarten des Explorer-Prozesses?

Genau! (leider)

Delphi-Quellcode:
//          To unload a DLL that Explorer won't let go of:
//            1) On the Taskbar choose: Start > Shut Down
//            2) Now hold down <CTL> <ALT> <SHIFT> and click "Cancel"
//            3) Explorer will be terminated
//            4) Hit <CTL> <ALT> <DELETE>
//            5) Choose "Task Manager"
//            6) Choose "New Task" in the lower right corner
//            7) Enter "Explorer.exe" in the edit box and hit "OK"
//            8) A fresh instance of Explorer will be started and your
//               DLL will be unloaded
Das hilft bei mir.

Machst du die Explorer-Extension gänzlich selber oder verwendest du fertige Komponenten?

generic 2. Sep 2008 10:56

Re: shell extension - unregister / unload
 
Bei ShellPlus.com gibt es ein Tool welches bei sowas hilft.

Das Tool heist Shell Reset:
http://www.shellplus.com/tools/shell_reset.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 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