2009-03-17 5 views
0

In Win32 ist das aktuelle Arbeitsverzeichnis des Hauptthreads auf den Speicherort festgelegt, von dem die ausführbare Datei gestartet wurde. Mein Problem ist, dass selbst nach einem Aufruf an SetCurrentDirectory() zu woanders, der Prozess anscheinend immer noch ein Dateisystem-Objekt verweist dieses anfängliche Startverzeichnis (verifizierbar mit einem Tool wie Process Explorer) - was bedeutet, dass dieser Direktor nicht gelöscht werden kann verarbeiten.Win32-aktuelles Verzeichnis, Sperren und Shell-Integration

Kennt jemand hier eine nicht zu hacky Lösung? Ich bin speziell auf das Problem mit einem Programm, das in Explorer integriert (Hinzufügen eines Verbs zu HKCR \ Directory \ Shell-Registrierungsschlüssel), muss ich Dateien in einem Verzeichnis mit der rechten Maustaste und das Entfernen des Quellverzeichnisses, was unmöglich ist zu verarbeiten Da das anfängliche Arbeitsverzeichnis auf festgelegt ist, haben Sie es erraten, das Verzeichnis mit der rechten Maustaste.

BEARBEITEN: Ich werde für den Ansatz "Hilfshilfe Start-von-gesund-Verzeichnis" gehen. Es ist vielleicht nicht sehr elegant, aber es wird funktionieren und erfordert keine fiesen Hacks.

+0

Sind Sie sicher, dass der Prozess nicht einen Verweis auf sich selbst, sondern das Verzeichnis enthält? –

+0

Ja, um sicher zu sein, machte ich ein einfaches Programm, das nichts außer SetCurrentDirectory() gefolgt von einer MessageBox() - die hält das Verzeichnis gesperrt :( – snemarch

+0

retag: hinzugefügt win32, entfernt aktuelle. Aktuelle ist nutzlos als Tag. – George

Antwort

1

Ihre einfachste Lösung könnte sein, nur einen kleinen Hilfsprozess zu starten, der in dem von Ihnen angegebenen Verzeichnis läuft (c: \, z.B.) und dann einfach das Programm beendet. Es muss möglicherweise mit einem Mutex synchronisiert werden, oder vielleicht nur zwei oder drei Mal auf einem Timer wiederholen ...

Ich hatte einen anderen Gedanken: Sie können CreateFile() mit FILE_FLAG_DELETE_ON_CLOSE verwenden. Dann sollte es verschwinden, wenn alle es loslassen, aber nur wenn es mit FILE_SHARE_DELETE geöffnet wurde.

+0

Das würde funktionieren, aber fühlt sich ein bisschen kludgy an - könnte die einfachste Lösung sein, aber – snemarch

+0

auf close löschen ist eine interessante Idee, aber CreateFile befasst sich nicht mit Verzeichnissen (es sei denn, Sie verwenden FILE_FLAG_BACKUP_SEMANTICS, aber ich bin mir nicht sicher, dass das funktionieren würde, und Es erfordert SE_BACKUP_NAME Privilegien :) – snemarch

+0

Vielleicht ... Ich habe den Dokumenten nur eine oberflächliche Untersuchung gegeben, als ich mich an das Löschen aus nächster Nähe erinnerte ... –