Announcement

Collapse
No announcement yet.

TIBDataBase in DLL verpacken (IB 5, IBX 4.52)

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

  • TIBDataBase in DLL verpacken (IB 5, IBX 4.52)

    Ich möchte den Zugriff auf eine Interbase-Datenbank über Funktionen einer DLL realisieren (dynamischer Import), die intern mittels IBX auf die Datenbank zugreift. Es zeigt sich, daß nach Herstellung der Verbindung zum DB-Server (Property Connected der TIBDataBase-Instanz auf True gesetzt), man die DLL mittels FreeLibrary nicht mehr entladen kann. Ursache könnte sein, daß beim Setzen von Connected := True von ??? zwei Threads erzeugt werden, die etwa bei Connected := False oder Aufruf von ForceClose nicht terminiert werden (zumindest wird dem DLL-Handler keine entsprechende Meldung übergeben - DLL_Thread_Detach).
    Auffällig erscheint noch das unterschiedliche Verhalten in Abhängigkeit des angesprochenen IB-Servers. Beim Local Server kann die DLL wenigstens noch mit Beendigung des die DLL ladenden Programmes (automatisch) entladen werden, beim Remote Server muß bereits die Verbindungsherstellung in eine Critical Section gepackt werden, der Versuch des "automatischen" Entladens bei Programmbeendigung muß mit der Reset-Taste bezahlt werden.

  • #2
    Hallo,

    IBX arbeitet prinzipiell in einer DLL (was jederzeit mit einer ISAPI-DLL nachgewiesen werden kann). Ich würde daher zuerst folgendes prüfen: <br>
    1. Keinen TIBSQLMonitor verwenden <br>
    2. Keine InterBase-Events (TIBEvents) verwenden<br>
    3. DisableMonitoring aufrufe

    Comment


    • #3
      Hallo, Andreas Kosch,
      vielen Dank für die schnelle Antwort. Leider hilft es nicht allzusehr, da ich zu Testzwecken die DLL auf die Minimalausstattung reduziert habe.

      function Connect : Boolean;

      begin
      EnterCriticalSection(aCS);
      try
      with ProblemDB do
      begin
      Connected := True;
      Result := Connected;
      end;
      finally
      LeaveCriticalSection(aCS);
      end;
      end;

      procedure DisConnect;

      begin
      EnterCriticalSection(aCS);
      try
      with ProblemDB do
      if TestConnected then
      ForceClose;
      finally
      LeaveCriticalSection(aCS);
      end;
      end;

      procedure InitDLL;

      begin
      InitializeCriticalSection(aCS);
      DisableMonitoring;
      ProblemDB := TIBDataBase.Create(nil);
      ProblemTransaction := TIBTransaction.Create(nil);
      with ProblemDB do
      begin
      DefaultTransaction := ProblemTransaction;
      DataBasename := 'server-iat:d:\user\interbase\LB_IAT.gdb';
      Params.Add('user_name=SYSDBA');
      Params.Add('Password=masterkey');
      Params.Add('lc_ctype=ISO8859_1');
      LogInPrompt := False;
      end;
      with ProblemTransaction do
      DefaultDataBase := ProblemDB;
      end;

      procedure FreeDLL;

      begin
      EnterCriticalSection(aCS);
      try
      with ProblemDB do
      begin
      if TestConnected then
      ForceClose;
      end;
      ProblemTransaction.Free;
      finally
      LeaveCriticalSection(aCS);
      end;
      DeleteCriticalSection(aCS);
      end;

      procedure DLLHandler(Reason : integer);

      begin
      case Reason of
      DLL_Thread_Attach: ShowMessage('Thread wird erzeugt');
      DLL_Thread_Detach: ShowMessage('Thread wird terminiert');
      end;
      end;

      exports
      Connect index 15,
      DisConnect index 16,
      InitDLL Index 71,
      FreeDLL Index 72;

      begin
      DLLProc := @DLLHandler;
      InitDLL;
      end.

      Das die DLL nutzende Programm importiert nach Laden der DLL die vier Prozeduren. Der Aufruf von InitDLL zieht das Erzeugen zweier Threads nach sich, die aber mit FreeDLL nicht terminiert werden. Beim nachfolgenden FreeLibrary hilft dann nur noch die IDE mit dem Programm-Reset

      Comment


      • #4
        Hallo,

        ich kann mich dunkel an eine eMail von Jeff Overcash erinnern, in der von Timing-Problemen die Rede war. Was passiert, wenn beim Freigeben eigene "Bremsen" (Sleep bzw. sonstige Warteschleifen) eingebaut werden

        Comment


        • #5
          Hallo,
          ändert leider nichts an der Sache. Läßt man DisableMonitoring weg, werden die Threads erst bei Aufruf von Connect erzeugt, so daß dann die DLL ohne Aufruf von Connect korrekt entladen wird. Auch beim statischen Import treten diese Probleme auf

          Comment


          • #6
            Hallo Spezialisten!

            versuche gerade, obigen Sachverhalt in einem Pogramm zu integrieren, bin aber auf den gleichen Sachverhalt gestoßen.
            Umgebung: Interbase6, IBX6.04, Delphi6

            Hat jemand eine Idee zur Lösung?

            Gruß
            Gunna

            Comment

            Working...
            X