Announcement

Collapse
No announcement yet.

DLLs und Tabellen im Hostprogramm

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

  • DLLs und Tabellen im Hostprogramm

    Wer kennt eine Möglichkeit, von DLLs aus Tabellen im Hostprogramm zu verwenden (Delphi 5), also direkt zu manipulieren? Als Parameter für Funktionen in DLLs dürfen sie offenbar nicht verwendet werden (auch mit der Unit für die Huge Strings). Andere Objekte gehen scheinbar!
    Danke für jeden Tip!

  • #2
    Hallo,

    wenn die Tabelle erst in der DLL geöffnet wird, steht der folgnde Weg zur Verfügung. Die Schnittstellenprozedur der DLL verwendet als ersten Parameter ein gültigen Database-Handle, das der Client über TDatabase.Handle beim Aufruf übergibt. Erst nachdem dieses Handle zugewiesen wurde, wird die Datenmenge (TQuery) geöffnet, so das die nun bereits vorliegende Datenbankverbindung mitgenutzt wird.

    <b>DLL:</b>
    <pre>
    unit DbDLLFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ComCtrls, Db, DBTables, Grids, DBGrids, ExtCtrls, DBCtrls, BDE;

    type
    TFormDbDLL = class(TForm)
    StatusBar1: TStatusBar;
    DBNavigator1: TDBNavigator;
    DBGrid1: TDBGrid;
    QueryDLL: TQuery;
    DataSourceDLL: TDataSource;
    DatabaseDLL: TDatabase;
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    FormDbDLL: TFormDbDLL;

    procedure ShowDllForm(aDBHandle : hDBIDb; aWndHandle: HWND);

    implementation

    {$R *.DFM}

    procedure ShowDllForm(aDBHandle : hDBIDb; aWndHandle: HWND);
    var
    aForm : TFormDbDLL;
    begin
    aForm := TFormDbDLL.Create(nil);
    try
    aForm.DatabaseDLL.Handle := aDBHandle;
    aForm.QueryDLL.Active := True;
    aForm.ShowModal;
    finally
    aForm.Release;
    end;
    end;
    </pre>
    <b>Anwendungsprogramm:</b>

    Zum Zeitpunkt des Aufrufs des Formulars aus der DLL ist die TDatabase-Instanz im Hauptformular der Anwendung bereits geöffnet. Somit kann die Anwendung ein gültigen Datenbank-Handle an die DLL übergeben:
    <pre>
    uses BDE;

    procedure ShowDllForm(aDBHandle : hDBIDb;
    aWndHandle: HWND); external 'DbDLL.dll';

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ShowDllForm(Database1.Handle, Handle);
    end;
    </pre>

    en

    Comment


    • #3
      Ich habe ein Programm mit genau dieser Funktionalität - nur beim beenden (DLL ist bereits vorher entladen) tritt eine heftige Schutzverletzung auf "Read auf Speicher Adresse 000000 (ähnlich)" - nur wenn das Handle zugewiesen ist.
      habe parallel auch Sessionobjekt, Sessionlist und Applicationobjekt der EXE an die DLL gegeben (und bei Close zurückgesetzt) - kein Erfolg, immer wenn Query offen war - Fehler beim beenden.

      Was kann das sein - wer hat Erfahrun

      Comment


      • #4
        An alle "Datenbänker":
        Scheinbar hören alle von mir gefundenen Diskussionen ohne lauffähige Lösung auf. Habe ebenfalls die Übergabe des IbDatabase-Handle getestet (IBX6.04). Ein Beenden des Hauptprogrammes ins nach aktiven Datenbankzugriff nicht mehr möglich.

        Was läuft da falsch?

        Gruß
        Gunna

        Comment

        Working...
        X