Ich habe ein Dienstprogramm, das Anwendungen durch einfaches Kopieren / Ersetzen der ausführbaren Dateien aktualisiert. Jetzt habe ich einige DLL-Dateien, die ebenfalls aktualisiert werden müssen. Manchmal lässt Windows mich jedoch nicht ersetzen, weil etwas es verwendet, und manchmal gibt es so viele Dinge, die DLL verwenden, dass ich nicht garantieren kann, dass es für mich entsperrt wird, um es zu ersetzen.
Derzeit besteht meine einzige Möglichkeit darin, zuerst die vorhandene DLL umzubenennen, und dann kann ich die neue DLL an ihrer Stelle kopieren. Aber dann wird die alte DLL mit einem geänderten Dateinamen zurückgelassen.
Wie kann ich eine DLL in dieser Situation programmatisch ersetzen?
Ihre Methode ist in Ordnung - benennen Sie die Datei einfach um und kopieren Sie die neue DLL an den richtigen Speicherort. Sobald dies erledigt ist, können Sie die Windows-API-Funktion verwenden MoveFileEx , um die alte Datei beim nächsten Neustart des Computers zu löschen. Aus der MSDN-Dokumentation:
Wenn dwFlags MOVEFILE_DELAY_UNTIL_REBOOT angibt und lpNewFileName NULL ist, registriert MoveFileEx die Datei lpExistingFileName, die beim Neustart des Systems gelöscht werden soll. Wenn lpExistingFileName auf ein Verzeichnis verweist, entfernt das System das Verzeichnis beim Neustart nur, wenn das Verzeichnis leer ist.
Sie möchten also etwas wie:
machen %Vor%Ich habe nicht viel mit Delphi gearbeitet. Vermutlich könnten Sie entweder die richtigen Windows-API-Funktionen importieren und diesen Aufruf direkt von Delphi aus ausführen, oder Sie schreiben ein kleines C ++ - Programm, das Sie aufrufen können, um dies für Sie zu erledigen.
Tags und Links dll delphi delphi-xe2 access-denied file-copying