Announcement

Collapse
No announcement yet.

BDE-Zugriff aus DLL scheitert nach FileOpen-Dialog

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • BDE-Zugriff aus DLL scheitert nach FileOpen-Dialog

    Ich habe eine DLL, die auf die BDE zugreift. Die BDE Zugriffe
    funktionieren "normalerweise". Ab und zu tritt sporadisch eine
    Exception auf, der Fehler lautet:

    "Bei der Initialisierung der Borland Database Engine ist ein
    Fehler aufgetreten (Fehler $2501).

    Nach langer Suche und Reduktion des Sources habe ich jetzt eine
    Kombination gefunden, wie ich den Fehler immer provozieren
    kann.

    1. Es muss parallel ein anderes Programm laufen, das die BDE
    verwendet.
    2. Der Fehler tritt nur auf, wenn im aufrufenden Programm
    (das kann ein Word-Makro sein oder eine C++ Exe oder eine
    Delphi Exe oder eine C-DLL oder oder) ein FileOpen-Dialog
    aufgerufen wurde.

    Meine Delphi-DLL habe ich jetzt mal auf ein Minimum reduziert,
    das sieht dann so aus (statt der Methode RemoveAllPasswords
    kann auch jede andere Methode, die letztendlich
    InitializeBDE aufruft, verwendet werden):

    ------------------------------->snip CODE START
    library testdll;
    uses
    dbtables;

    procedure AccessBDE; stdcall;
    begin
    //hier krachts, aber nur wenn ein anderes Prg auf die
    //BDE Zugriff hat und vom aufrufenden Programm zuvor
    // ein Datei-Öffnen-Dialog aufgerufen wurde.
    Session.RemoveAllPasswords;
    end;

    exports AccessBDE;

    {$R *.RES}
    begin
    end.
    ------------------------------->snip CODE ENDE

    Als nächstes der Ausschnitt aus meinem Testprogramm
    (ebenfalls in Delphi, spielt aber keine Rolle, ob Makro oder...):

    ------------------------------->snip CODE START
    procedure TForm1.Button1Click(Sender: TObject);
    var
    libhandle : HMODULE;
    OpenDialog: TOpenDialog;
    ptr : function:WORD;

    begin
    OpenDialog := TOpenDialog.Create(Self);
    OpenDialog.Execute;
    libhandle := LoadLibrary('c:\test\testdll.DLL');
    if libhandle <> 0 then begin
    @ptr := GetProcAddress(libhandle, 'AccessBDE');
    if assigned(ptr) then
    ptr;
    FreeLibrary(libhandle);
    end;
    end;

    ------------------------------->snip CODE ENDE

    Lässt man den OpenDialog.Execute weg, erscheint keine Exception!

    Anbei noch die CallStack-Information. Sollte jemand eine
    Idee haben, wäre ich sehr dankbar.


    Call Stack Information:
    ---------------------------------------------------------------------
    |Address |Module |Unit |Class |Procedure/Method
    ---------------------------------------------------------------------
    |014A0E79|testdll.DLL |DBTables.pas| |DbiError
    |014A0E68|testdll.DLL |DBTables.pas| |DbiError
    |014A0E85|testdll.DLL |DBTables.pas| |Check
    |014A0E80|testdll.DLL |DBTables.pas| |Check
    |014A26D0|testdll.DLL |DBTables.pas|TSession|InitializeBDE
    |013C4364|testdll.DLL |system.pas |TObject |Free
    |014780AE|testdll.DLL |Dialogs.pas | |DoMessageDlgPosHelp
    |014A2618|testdll.DLL |DBTables.pas|TSession|InitializeBDE
    |014A3780|testdll.DLL |DBTables.pas|TSession|StartSession
    |014A36D4|testdll.DLL |DBTables.pas|TSession|StartSession
    |014A310D|testdll.DLL |DBTables.pas|TSession|SetActive
    |014A30EC|testdll.DLL |DBTables.pas|TSession|SetActive
    |014A2B11|testdll.DLL |DBTables.pas|TSession|MakeCurrent
    |014A2AF4|testdll.DLL |DBTables.pas|TSession|MakeCurrent
    |014A2AD4|testdll.DLL |DBTables.pas|TSession|LockSession
    |014A2ABC|testdll.DLL |DBTables.pas|TSession|LockSession
    |014A2FCE|testdll.DLL |DBTables.pas|TSession|RemoveAllPasswords
    |014A2FC4|testdll.DLL |DBTables.pas|TSession|RemoveAllPasswords


    Besten Dank schon Mal,
    Thomas
    Zuletzt editiert von thomasm; 01.08.2007, 10:32.

  • #2
    Die Idee ist einfach die BDE nicht mehr einzusetzen! Der OpenDialog läd im Hintergrund einen Rattenschwanz an DLL's nach (Da ja hier Komponenten des Windows- und Internetexplorers verwendet werden). Und Borland hat die Weiterentwicklung aufgegeben und Pflegt die BDE nur noch soweit eine Auslieferung mit neue Delphi-Versionen nötig ist.

    Welche DB wird den verwendet? Für jede gibt es bessere, stabilere, einfacher zu pflegende Alternativen.

    Comment


    • #3
      Originally posted by Bernhard Geyer View Post
      Die Idee ist einfach die BDE nicht mehr einzusetzen!
      Hey, hey, hey, tolle Idee. Hatte ich auch schon. Bin auch schon dabei. Geht leider nur nicht so schnell 62 Anwendungen, 34 DLL's und 812 Tabellen mal so umzustellen. Insofern, danke für den Lösungsvorschlag, der mein Problem sicher in 6 Monaten gelöst haben wird.

      Ich würde mich auch noch auf Lösungen freuen, die vom Zeithorizont etwas näher zu realisieren sind :-)

      Thomas

      Comment


      • #4
        Originally posted by thomasm View Post
        Hey, hey, hey, tolle Idee. Hatte ich auch schon. Bin auch schon dabei. Geht leider nur nicht so schnell 62 Anwendungen, 34 DLL's und 812 Tabellen mal so umzustellen. Insofern, danke für den Lösungsvorschlag, der mein Problem sicher in 6 Monaten gelöst haben wird.
        Immerhin bist du drüber. Unverbesserliche lassen das Ende auf sich zukommen

        Originally posted by thomasm View Post
        Ich würde mich auch noch auf Lösungen freuen, die vom Zeithorizont etwas näher zu realisieren sind :-)
        Was passiert wenn eine TWebBrowser erzeugt/angezeigt wird. Dort dürten so ziemlich der gleiche DLL-Rattenschwanz geladen werden wie beim OpenDialog

        Comment


        • #5
          TWebBrowser kann ich ohne Probleme einbinden und auch füllen.
          Der Fehler kommt dann nicht mehr.
          Sobald TOpenDialog wieder im Spiel ist, funktionierts nicht mehr.

          Habe das übrigens auf 5 verschiedenen Rechnern unter xp und vista ausprobiert, überall das gleiche Spiel.

          Auch mal auf einem anderen Rechner kompiliert (btw Delphi 2007 Update 1) usw. usf.

          Comment


          • #6
            also ich hatte dasselbe problem seitdem ich winxp einsetze und mein chef mir nen schnelleren rechner hinstellte!
            nach langem googlen konnte ich das problem mittels veränderter bde-einstellung zum teil lösen! probier doch mal folgendes:

            1. bde-verwaltung öffnen
            2. konfiguration / system / init
            3. maxbufsize=2048
            4. sharedmemlocation=0x5BDE
            5. sharedmemsize=20480

            hab da allerdings viel rumprobiert - entscheidend war glaub ich auch welche bde-version du einsetzt.
            ich hatte 3 zur auswahl und nur mit der deutschen 5.01er hat es so funktioniert. wobei das problem nicht bei unseren kunden sondern nur auf meinem entwicklungssystem auftrat!!!

            Comment

            Working...
            X