![]() |
Datei im Netzwerk finden ohne unc Pfad
Moin Moin,
ich hab da ein kleines Problem... und zwar läd eine meiner DLLs eine firebird gdb, wenn ich connected auf True setzte kann es zu einer exception kommen, in diesem Fall soll auf eine andere Datenbank ausgewichen werden (mit Try except abgefangen). Das funktioniert alles auch ganz Toll. Es kommt zwar immer 'ne nervige Exception wenn ich im Delphi das Programm starte, aber die ist ja abgefangen. ungefähr so: (Delphi7)
Delphi-Quellcode:
Jetzt das Problem:
try
TestDB.Databasename := '\\TestComputer:c:\test\Test1.gdb' TestDB.Connected := true; except TestDB.Databasename := '\\TestComputer:c:\test\Test2.gdb' TestDB.Connected := true; end; Da die DLL dynamisch geladen wird muss sie ja auch wieder entladen werden. Und genau da hängt sich die DLL aufrufenden (bzw. entladenede) Applikation auf. Danach bewegt sich nix mehr... :wall: Ich hatte die waage Hoffnung über TIBDatabase mit einem Fileexist, oder Ähnliches, die Try Except Geschichte zu umgehen und somit ohne Exeption auszukommen. Wenn der gar nicht erst in den Except-Part springt habe ich das Problem nicht. Natürlich befindet sich die gdb nicht lokal und ausser dem Databasepath ist nichts bekannt also auch keinen Unc-Pfad.(wäre ja auch zu einfach dann...) Also hab ich nur Rechnername und Lokalerpfad auf diesem Rechner. Hab aber nichts gefunden. Vielen dank im voraus. Sar D'Ger |
Re: Datei im Netzwerk finden ohne unc Pfad
Hallo,
umgehen kannst du das try except nicht. Ich würde mal den Code ohne Dll prüfen (also alles in eine externe Unti auslagern), was heisst denn "hängt" ? Wo genau hängt er. Du kannst unter Delphi ja auch Dlls debuggen. Heiko |
Re: Datei im Netzwerk finden ohne unc Pfad
Ich kann den Post von Hoika nur lesen wenn ich den zitiere, merkwürdig...
Für den Fall das andere dasgleiche Problem haben hier nochmal: Zitat:
keine Lösung, da sich die DLL nunmal zwingend mit der Datenbank verbinden muss. "Er hängt" heisst das er nachdem das Programm beim entladen der DLL
Delphi-Quellcode:
nichts mehr tut. Ich komm dann nur noch mit Strg+F2 raus.
FreeLibrary(hDLLTest);
Das debugen der DLL bringt nichts. Das Problem tritt ja erst im Programm auf, aber eben nur wenn die Exception ausgelöst wurde. Grüsse, Sar D'Ger |
Re: Datei im Netzwerk finden ohne unc Pfad
Hallo,
1. Benutzt du Threads ? 2. Ist die IBDataBase in der Dll erzeugt oder "irgendwie" übergeben ? 3. Hängt er genau in dem FreeLibrary ? 4. Was passiert, wenn du selber eine Exeption in der Dll erzeugst (raise Exception.Create('hoika weiss (fast) alles')) nur um zu testen, dass dort nicht irgendwas rumlungert. 5. nimm mal memcheck oder madexcept, vielleicht überschreibt deine Dll Speicher. Heiko |
Re: Datei im Netzwerk finden ohne unc Pfad
huhu,
zu 1. Nein. zu 2. Die Dll einthält ein TDataModule auf dem die TIBDatabase liegt. Vor dem TDatabase.destroy setzte ich Conneted := False; zu 3. Ja - genau da. zu 4. raise Exception.Create('hoika weiss (fast) alles') hat keine weiteren Auswirkungen. Programm läuft weiter. zu 5. hab FastMM am laufen - da steht aber nix was daruf schliessen liesse. Es sieht so aus als ob die TIBDatabase, obwohl das TDatamodule und somit auch die TIBDatabase, bereits "gefreed" wurde noch irgentwo "den Finger" drauf hätte und deswegen nicht entladen werden kann. Mal sehen ob ich auf der Schiene weiter komme... Sar D'Ger |
Re: Datei im Netzwerk finden ohne unc Pfad
Hallo,
zu 2. das ist nicht notwendig. Ausserdem: was heisst hier "vor dem DataBase.Destroy" ? Wenn die IBDataBase über das DataModul automatisch erzeugt wird, wird es vom diesem DataModul auch selber freigeben. Beim Freigeben des IBDataBase wird automatisch disconnected. Wo genau gibst du denn das DataModul frei ? Heiko |
Re: Datei im Netzwerk finden ohne unc Pfad
So war das ja nicht gemeint.
Ich hab das ganz so aufgebaut. Programm part: Dll laden Funktions aufruf Test DLL part: TDatamodul (DM) erzeugen inkl. TDatabase Database vebinden <- hier ist die try except Geschichte Daten aus der Datenbank laden verändern Daten in Datenbank schreiben Databaseverbindung trennen TDatamodul freigeben Freeandnil(DM) Programm Part: DLL entladen FreeLibrary(hDLLInterface); <- ab hier bewegt sich das Programm nicht mehr wenn er durch den Except-Part musste, sonst auch hier kein Problem Wie gesagt, wenn der die erste Datei findet, läuft alles wie es soll. Springt er in den except-Part, dann ist beim entladen Schicht im Schacht... Sar D'Ger |
Re: Datei im Netzwerk finden ohne unc Pfad
Hallo,
probier mal folgendes
Delphi-Quellcode:
Heiko
bConnected:= False;
try bConnected:= ConnectDB1... bConnected:= IBDB.Connected; except end; if not bConnected then begin try bConnected:= ConnectDB22222... bConnected:= IBDB.Connected; except end; end; |
Re: Datei im Netzwerk finden ohne unc Pfad
Hab die Nuss geknackt !!! :coder2:
in der DLL prüfen:
Delphi-Quellcode:
So bekomme ich keine Exception und somit auch keine Problem beim entladen der DLL. :dancer:
function CheckDBisAvailable(DB: TIBDatabase): Boolean;
Var GDSL : IGDSLibrary; DPB : String; DPBLength : short; I : Integer; Begin GDSL := GetGDSLibrary; GenerateDPB(DB.Params, DPB, DPBLength); I := DB.Call(GDSL.isc_attach_database(StatusVector, Length(DB.DatabaseName), PChar(DB.DatabaseName), @DB.Handle, DPBLength, PChar(DPB)), False); if I = 0 then Result := true else Result := False; end; . . . DM.TestDB.DatabaseName := 'C:\Test1.gdb'; DM.TestDB.LoginPrompt := False; DM.TestDB.Params.Add('USER_NAME=Test'); DM.TestDB.Params.Add('password=Test'); if CheckDBisAvailable(DM.TestDB) then DM.TestDB.Connected := true else Begin DM.TestDB.DatabaseName := 'C:\Test2.gdb'; DM.TestDB.Connected := True; end; . . . So ich geh jetzt 'ne Kuh töten... man man man, was für ein gefummel. Aber jetzt läufts. Vielen lieben Dank für die viele Mühe, hoika. Deine Lösung werd ich aber auch noch testen. Ich hoffe dieser Threat hilft anderen auch. :) Cya, Sar D'Ger P.S. Zitat:
|
Re: Datei im Netzwerk finden ohne unc Pfad
Hm,
das wäre also ein schnellere Variante, wie das was ich immer gemacht hatte (dummy query schicken) *kopier* ;) Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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