![]() |
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, |
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.
|
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 |
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.
|
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? |
Re: shell extension - unregister / unload
Zitat:
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 |
Re: shell extension - unregister / unload
ok, danke
|
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. |
Re: shell extension - unregister / unload
Zitat:
Delphi-Quellcode:
Das hilft bei mir.
// 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 Machst du die Explorer-Extension gänzlich selber oder verwendest du fertige Komponenten? |
Re: shell extension - unregister / unload
Bei
![]() Das Tool heist Shell Reset: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz