AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi shell extension - unregister / unload
Thema durchsuchen
Ansicht
Themen-Optionen

shell extension - unregister / unload

Ein Thema von xineohp · begonnen am 1. Sep 2008 · letzter Beitrag vom 2. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#1

shell extension - unregister / unload

  Alt 1. Sep 2008, 19:33
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,
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: shell extension - unregister / unload

  Alt 1. Sep 2008, 19:36
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#3

Re: shell extension - unregister / unload

  Alt 1. Sep 2008, 19:48
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
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: shell extension - unregister / unload

  Alt 1. Sep 2008, 19:53
Ü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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#5

Re: shell extension - unregister / unload

  Alt 1. Sep 2008, 20:31
Ok, ich erhalte drei Add und drei Release und zwar in folgender Reihenfolge:

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

Wie gehts weiter?
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#6

Re: shell extension - unregister / unload

  Alt 1. Sep 2008, 20:44
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
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#7

Re: shell extension - unregister / unload

  Alt 1. Sep 2008, 21:14
ok, danke
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: shell extension - unregister / unload

  Alt 2. Sep 2008, 07:10
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#9

Re: shell extension - unregister / unload

  Alt 2. Sep 2008, 11:40
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?
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#10

Re: shell extension - unregister / unload

  Alt 2. Sep 2008, 11:56
Bei ShellPlus.com gibt es ein Tool welches bei sowas hilft.

Das Tool heist Shell Reset:
http://www.shellplus.com/tools/shell_reset.html
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.
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