2012-08-28 3 views
8

Meine allgemeine Frage ist, wie Sie Fehler beheben können "Mein BPL wird aufgrund einer Abhängigkeit nicht geladen geh weg, egal wie viel ich aufräume und neu kompiliere ". Update Sie denken vielleicht, dass Sie ein sauberes neu kompiliertes System haben, aber dank des umgekehrten Wunders, das Windows und seine Dateisystemvirtualisierungsfehlfunktionen sind, haben Sie nicht.Lösen von Problemen mit Delphi BPL-Paketen, bei denen BPLs nicht geladen werden, aber bereits neu kompiliert wurden (Windows VirtualStore-Dateisystemproblem)

Wenn ich versuche, mein Entwurfspaket zu laden (in diesem Fall genannt dclFsTee.bpl) in meine Delphi IDE (es ist das schnelle Bericht 4 TeeChart Wrapper-Komponente Paket), es klagt:

The program can't start because tee7100.bpl is missing from your computer. Try reinstalling ... 

Die tee7100.bpl ist nicht referenziert auf jeder DCP- oder DCU-Datei auf meinem System, die ich kenne. Aber klar, etwas stimmt nicht, und ich kann das Problem nicht finden.

Alle Delphi-Benutzer sehen sich mit hundert Problemen konfrontiert, die nicht mit BPLs kompiliert oder nicht geladen werden können. Der allgemeine Refrain, wenn Sie gefragt werden, was zu tun ist, ist, Ihren Computer aufzuräumen.

Allerdings habe ich jetzt Stunden damit verbracht, meinen Computer aufzuräumen, und während alles die Datei kompiliert, muss irgendwo irgendwo veraltet sein, weil die resultierende BPL-Datei, die ich zu laden versuche, immer noch geladen werden will eine Version einer TeeChart BPL, die ich vor Tagen aus diesem System entfernt habe, zusammen mit jeder Spur, die ich finden konnte.

Die Spuren von TeeChart in Delphi 2007, die ich entfernt habe, enthalten alles im Ordner $ (BDS) \ Lib und $ (BDS) \ Lib \ debug und alle DCP- und BPL-Ordner auf dem System. Auch jede TeeChart-Einheit namens dcu-Datei ist weg.

Sobald Sie am Ende der Straße angekommen sind, was versuchst du als nächstes? (Formatieren Sie die Festplatte, kaufen Sie einen neuen Computer.) Im Ernst. Ich denke, ich bin ein kluger Typ, aber ich habe eine 1 TB Festplatte, einen Bibliothekspfad, der zu mehr als 80 Ordnern führt, und ein Quellcode-Repository, das gut organisiert zu sein scheint, aber eindeutig versteckt sich etwas, wo ich nicht kann finde es.

Ich habe TeeChart Standard 2012, mit vollem Quellcode, und soweit ich weiß, enthält meine Entwicklungsmaschine keine alten TeeChart BPLs oder DCP-Dateien mehr von der "techart tee7100.bpl" Version, die mit delphi ausgeliefert wird.

Ich habe den Assistenten "rekompile.exe" ausgeführt, der mit teechart geliefert wird, das MSBuild einfach auszuführen und die Pakete zu erstellen, nachdem eine {$ DEFINE x} -Deklaration in die tee.inc-Dateien geschrieben wurde (es gibt zwei sie in der Quellenverteilung).

Irgendwie scheint es implizit so zu sein, als ob einer der impliziten Importe in eines der Pakete eine veraltete Datei zeichnet, die nicht neu erstellt wurde und die daher versucht, das tee7100.bpl zu laden. Der neue bpl-Name lautet tee911.bpl.

Anstatt die Frage ziemlich spezifisch-zu-schnell zu stellen, erwähne ich sie nur als eine spezifische Instanz einer allgemeinen Welt der Verletzung, der ich Dutzende Male bei der Entwicklung in Delphi begegnet bin.

Ich gebe nur die Details des schnellen Berichts, so dass Sie sehen können, dass es sich tatsächlich um eine bestimmte Instanz eines allgemeinen Problems handelt, mit dem man manchmal in der Delphi-IDE konfrontiert wird, wenn es sich um einen Komponentenquellcode oder -paket handelt Pakete mit Abhängigkeiten. Bereinigen Sie Ihren Computer, so dass Ihr Code sogar baut.

So, hier ist meine Delphi-Paket-zu-Paket-Abhängigkeit auflösender Frage:

  1. Was ist der effektivste Weg ist implizite Last-of-some-Nicht-mehr-wollte finden oder Spuren BPL-Probleme, so dass mein Code (der genau richtig baut und kompiliert!) In die Delphi IDE geladen wird. Die BPL-Datei, die aus dem Ausführen von Neukompilieren resultiert, scheint ordnungsgemäß mit den richtigen DCP-Dateien verknüpft zu sein, und keine alten/veralteten DCP- oder DCU-Dateien sind vorhanden. Der neue DCP-Dateiname lautet beispielsweise tee911.dcp.

  2. Können Sie irgendwie, irgendeine Idee von, was Paket ist eigentlich abgestanden, und was wird gelesen und verknüpft und statisch importiert, wenn die. BPL-Links? (Ich vielleicht wie eine spezielle MAP-like-Datei für BPL-Dateien gedacht?)

aktualisierst Nach vielen Stunden mit diesem Kampf, und mit jedem Trick, den ich weiß, ich erkennen ich nicht checked for some VirtualStore related issues hatte verursacht durch Dateivirtualisierung in Windows 7. Das bedeutet, dass Windows 7 auf den Programmen liegt, die darüber laufen. Es gibt Ihnen eine andere Version der Datei, die nicht die gewünschte ist. Dies kann in mehrfacher Hinsicht tödlich sein; Ein; Sie kompilieren einen BPL, aber das lädt nicht. Die BPL, die mich getötet hat, befand sich im SysWow64-Ordner, der Teil des VirtualStore war. Beachten Sie, dass der virtuelle Speicher grundsätzlich Phantomdateien anzeigt, die nur vorhanden sind, wenn Sie ein bestimmtes "Low-Priory" -Programm sind, was Delphi 2007 unter Win7/64 bit ist. BPL-Dateien in Ihrem SysWow64 Virtuals Ordner für das aktuelle Benutzer-Account zu entfernen:

del %HOMEPATH%\AppData\Local\VirtualStore\Windows\SysWow64\*.bpl 

... An manchen Tagen hasse ich nur Windows-Architektur. Wie auch immer, ich werde das Obige nicht als Antwort verwenden, weil ich gerne wissen würde, ob jemand einen besseren Weg oder einen Tipp oder Vorschlag hat, der beim nächsten Mal helfen könnte.

+0

Wa sind um eine Belastung des bpl in der IDE zu sprechen (dh ein Design-Zeit-Paket) sind nicht wir und nicht die Last der bpl zur laufzeit durch eine exe ihrer eigenen herstellung? –

+0

Ja, Designtime Laden einer BPL, die ich gerade aus Quellen neu kompiliert habe, aber die etwas abgestanden sein muss, dass ich einfach nicht finden kann ... –

+0

Angenommen, Sie haben bereits alle Ordner auf dem Systempfad Ihrer Umgebung durchsucht Suche in der Registry nach den Schlüsseln _und_ data nach dem nicht gefundenen Dateinamen.Oh, und ich würde die C: \ users \ public und c: \ users \ all Ordner überprüfen. –

Antwort

9

Okay, niemand antwortete sonst so werde ich dies hier setzen hilfreich für zukünftige Menschen zu sein:

- Windows-Virtuals Denken Sie daran, wenn gebrochene Systeme Reinigung, die alten Versionen von DLLs auf sie einschließlich TeeChart, Fastreport haben, Indy und so weiter, die dazu neigen, an Verwirrungen beteiligt zu sein, weil sie sowohl als "Out-of-Box-Pakete, die mit Delphi ausgeliefert werden" als auch häufig als aktualisierte Versionen installiert werden können, wenn Sie sie von den Herstellern direkt oder drittens kaufen und installieren haben Sie Ihre eigene kompilierte Kopie im Mega-Component-Pack-Verzeichnis Ihres Unternehmens.

- Wenn Sie nach doppelten oder veralteten BPLs suchen, eine Dateisuche in Windows nicht in den virtuellen Speichern suchen, müssen Sie den gesamten virtuellen Speicherbereich für Ihren Prozess oder Benutzer oder Programm suchen und zappen , manuell.

Die zweite Ebene dieses Problem ist dies:

Die Abhängigkeitsgraphen für Fastreports ist komplex:

  • Es hängt von Indy und Sie könnten Ihre eigene Version von Indy haben, und Delphi selbst hat ein und andere Dinge auf Ihrer Festplatte könnten ihre eigene Kopie von Indy haben.

  • Es unterstützt verschiedene Ausgaben von TeeChart, einschließlich der Binärdateien, die mit Delphi geliefert werden, und vielleicht die Standard-Version oder andere gekaufte Version von TeeChart, die Sie möglicherweise von Steema gekauft haben.

  • Es verwendet eine vorkompilierte Header-Include-Datei für die Kompilierung und nicht nur EINE, sondern ZWEI verschiedene Kopien einer gleichnamigen INC-Datei.

  • Wenn Sie ihr eigenes Compiler-Tool (kompilieren FastReport) verwenden, funktioniert es ziemlich zuverlässig, aber ist nicht das beste für, wenn Sie alles in Ihrem Projekt von einem einzigen Build-Skript erstellen möchten, also die Quelle meines Problems.

  • Der Schlüssel ist, alles über die Abhängigkeiten aller Komponenten in Ihrem riesigen Stapel von Paketen zu erfahren und Ihr System sauber zu organisieren, so dass Sie keine alten Sachen (wie Indy und TeeChart bpls) haben , dcp oder dcu files) rumliegen. Das zu bereinigen, ist eine ziemlich komplexe Aufgabe, wenn Sie nicht wissen, was Sie tun.

    • Ein Dienstprogramm, um wirklich alle Spuren der Version von Indy und TeeChart mit Ihrem System des Schiff zu entfernen, und die „Embarcadero Edition“ von Fastreport ist der Schlüssel, diese Situation zu lösen bekommen. Ein allgemeiner Tipp lautet: "Wenn eine Version von X mit Delphi geliefert wird und Sie eine neue Version installieren, sollten Sie sich darauf einstellen, dass Sie leiden müssen, bis Ihr System wirklich aufgeräumt ist".

    • Eine wirklich erstaunliche Technik, um all diesen Mist zu vermeiden, besteht darin, Indy, FastReport oder TeeChart während der ersten Delphi-IDE-Installation einfach nicht zu installieren (sie zu deaktivieren oder zu überspringen) und sie dann einzeln nacheinander zu installieren. Nur weil eine Version in Delphi vorinstalliert ist, macht das keine gute Sache. (Update: Sie können Indy während der Installation nicht mehr abwählen, es ist seit mindestens Delphi XE8 Teil des Delphi-Basisprodukts. Ein Säuberungswerkzeug zum Entfernen des eingebauten Indy aus Delphis eigenen Lib-Verzeichnissen ist für jeden notwendig, der ein eigenes erstellt .)

    • Eine weitere wirklich erstaunliche Technik besteht darin, die Installer für kommerzielle Komponenten auf einer virtuellen Maschine auszuführen, dann einfach den Pascal-Quellcode zu sammeln und auf Ihren sauberen Entwicklungscomputer zu übertragen und ihn selbst zu erstellen. Auf diese Weise können Sie die schrecklichen Dinge vermeiden, die passieren, wenn Sie BPLs und andere Dinge in Ihrem System haben und sogar in C:\Windows\System32 (auf 32-Bit-Systemen) und C:\Windows\SysWow64 (der entsprechende Pfad auf 64-Bit-Systemen) installiert sind.

+0

Ich habe viele Komponenten installiert und habe kein Problem, aber wenn ich DevArt SDAC installiert habe, ist es erfolgreich, bis ich das Delphi nicht verlassen habe. Jedes Mal, wenn ich die Delphi verlassen und erneut ausführen, zeige mir das "Programm kann nicht gestartet werden, dac105.bpl von Ihrem Computer fehlt. Versuchen Sie es erneut ..." Ich kann nicht finden :( – QMaster

+0

Ihr Weg ist wahrscheinlich falsch, fehlt entweder die Verzeichnis, das dac105.bpl enthält, oder das Verzeichnis, das eine andere dll enthält, die dac105.bpl lädt, wenn sie geladen wird –

+0

Danke @ Warren Ich habe es gefunden Ich habe vergessen, einige .bpl vielleicht zu installieren Sowieso habe ich als zweiten Weg installiert Komponenten zu IDE (auf der letzten Seite von SDAC Installer erwähnt) und das ist perfekt funktionieren. kurzen Abschnitt der zweite Weg ist: "Finden Sie in der 'make.bat' Zeile mit SetDir =" D: \ Programme \ Borland \ Delphi und stellen Sie sicher, dass der richtige Pfad zu IDE eingestellt ist und 'Make.bat' .... " – QMaster

3

setzen, dass BPL (tee7100.bpl) unter $ (BDSCOMMONDIR) \ Bpl

for XE: $(BDSCOMMONDIR)= "C:\Users\Public\Documents\RAD Studio\8.0" 
for XE5: $(BDSCOMMONDIR)= "C:\Users\Public\Documents\RAD Studio\12.0" 
+0

Das hätte mir in meinem Fall nicht geholfen, aber könnte einem anderen helfen, der googelt. +1 für den Versuch, hilfreich zu sein! –

1

Die andere Frage, die dies verursachen kann, wird der Ordner nicht mit dem Sie gespeichert haben Ihre .bpl-Dateien in Ihrem Systempfad.

Dies passiert, weil Delphi versucht, die WinAPI-Funktion LoadLibrary mit einem Dateinamen anstelle eines absoluten Pfades aufzurufen. Wenn Windows die Datei nicht finden kann, kann sie von Delphi nicht geladen werden.

Weitere Informationen finden Sie unter this forum post.

Dies scheint in Windows 7 ein Problem zu sein, wenn auch nicht in Windows 10.

+1

Für den einfacheren Fall von "My BPL wird nicht geladen" (aber der Rest meiner Frage, die über ein transitives Diagramm von Abhängigkeiten fehlschlägt) ist dies die einfachste Antwort. In dem Fall, in dem wir wissen, dass der Pfad nicht die Ursache ist, ist der transitive Graph der Abhängigkeiten, der entweder aufgrund des Pfades oder aufgrund einer Nichtübereinstimmung der Versionen der internen Einheitsschnittstellen fehlschlägt, die zweite Ursache. –

+0

@WarrenP Absolut. Ich habe das nur hinzugefügt, weil Ihre einzige Frage war, dass bpl-Dateien nicht geladen werden konnten, und das war die Lösung für meinen Fall. –

Verwandte Themen