Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO Connection in DLL -> .Open = Fehler (https://www.delphipraxis.net/109612-ado-connection-dll-open-%3D-fehler.html)

mika 4. Mär 2008 15:08

Datenbank: MS Access • Version: 2000/2003 • Zugriff über: adoConnection -> DSN Eintrag

ADO Connection in DLL -> .Open = Fehler
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo erstmal :)

ich hoffe ihr könnt mir bei meinem Problem weiterhelfen. Hab schon allerhand gegoogelt und auch hier im Forum gesucht, leider ohne Erfolg. Ich habe eine Klasse geschrieben die über ein Datenbankformular auf eine MS-Access 200 oder 2003 Datenbank zugreifen soll um Werte auszulesen. Das ganze hat den Zweck einer anderen Applikation mit DLL Schnittstelle die Möglichkeit zu geben Double Werte aus der Datenbank zu holen.

Leider stürzt die DLL immer in dem Datenbankformular in der
Code:
// Standardkonstruktor
// : Öffnet die Datenbankverbindung
procedure TiSIM_Database.DataModuleCreate(Sender: TObject);
Var
    DatabaseFile: String;

begin
    changeDebugMode(0);

    DatabaseFile := ReadFromRegistry(
       HKEY_CURRENT_USER,
        'SOFTWARE\ODBC\ODBC.INI\iSIM',
        'DBQ');

    if Trim(DatabaseFile) = '' then
    begin
        MessageDlg('Benutzerspezifischer Datenbankalias "iSIM" nicht vorhanden!',
            mtError, [mbOK], 0);
        Abort;
    end;

    if Not SysUtils.FileExists(DatabaseFile) then
    begin
        MessageDlg('Datenbankdatei im Alias iSIM nicht korrekt!' + #13#10 +
            '"' + DatabaseFile + '"',
            mtError, [mbOK], 0);
        Abort;
    end;

    // Hier kommt der Fehler !!
    adoDatabaseConnection.Open;
end;
ab und ich kann den Fehler nicht finden. Wenn ich meine Units zu einer "normalen" Win-Applikation kompiliere funktioniert alles tadellos. Habe schon beim Initialisieren/Finalisieren der DLL OleInitialize und ComInitialize aufgerufen, brachte jedoch keine Verbesserung des ganzen.

Im Anhang ist die Datei des DLL-Projektes und das Datenbankformular. Ich hoffe jemand von euch weiss einen guten Rat da ich schon seit Tagen an diesem Problem knabbere.


Danke schonmal für jedwede Hilfe.

sirius 4. Mär 2008 18:42

Re: ADO Connection in DLL -> .Open = Fehler
 
Und das Objekt existiert bereits?

mika 5. Mär 2008 09:59

Re: ADO Connection in DLL -> .Open = Fehler
 
Hallo sirius,

ja das Objekt liegt auf dem Datenbankformular (ist auch im Anhang meines Ursprungspost). Das Datenbankformular ist ein Standard Delphi Datennmodul und wird beim initialisieren der DLL erzeugt.

sirius 5. Mär 2008 10:27

Re: ADO Connection in DLL -> .Open = Fehler
 
(Brauchst du kein Passwort/Benutzernamen für die Datenbank?)

Den Fehler finde ich direkt nicht, aber was mir noch aufgefallen ist:
1. AddTerminateProcs dürfte in einer DLL nicht funktionieren. Du hängst deine Funktion zwar an eine Liste an. Allerdings hat die DLL eine eigene Liste und ausgeführt wird IMHO nur die Liste in der EXE.
2. Nutze besser DLL_Process_Attach/DLL_PROCESS_DETACH, dann hast du auch gleich Punkt 1 erledigt (siehe Hilfe: DLLProc).
3. Ich würde noch versuchen, das open mal aus dem Create rauszunehmen und etwas später auszuführen.

Prinzipiel geht es mit der DLL. Ich habe das in einem Projekt auch so: Alle ADO-Komponenten befinden sich auf einem DataModul, welches von einem Thread in einer DLL genutzt wird.

mika 5. Mär 2008 11:06

Re: ADO Connection in DLL -> .Open = Fehler
 
Hallo Sirius,

danke erstmal das du probierst mit mir den Fehler zu finden!

Zu deinen Antworten.

1.) Ich habe mit Showmessage mir einfach mal kleine Debugmeldungen eingebaut. Meine Ausstiegsprozedur wird ausgeführt und alles.
Aber ich schaue mir deine Hinweise gern mal an.

2.) Die beiden Keywords kenne ich gar nicht. Muss ich mir glaube ich mal ansehen.

3.) Das wäre ne Idee. Hab ich mir gestern abend auch mal überlegt. Allerdings glaube ich nicht das das Abhilfe schafft den wie
gesagt funktioniert das ganze als Applikation ja tadellos... Ich hatte erst gedacht das mir das OleInitialize helfen würde aber das war ja auch nicht die Lösung :-/

sirius 5. Mär 2008 14:43

Re: ADO Connection in DLL -> .Open = Fehler
 
also ich habe noch mal bei mir nachgesehen. Ich habe auch eine Funktion, die exportiert wird, in der direkt die Adoconnection initialisiert und geöffnet wird.

Was kommt den für ein Fehler?

mika 5. Mär 2008 15:34

Re: ADO Connection in DLL -> .Open = Fehler
 
Leider gar keiner.... die DLL hört anscheinend einfach auf...

Ich hab vor und nach der entsprechenden Zeile mal ein Showmessage eingebaut und wenn ich die DLL lade kommt das "vor" aber nicht das "nach" :-( Kannst du eventuell mal n bisschen Beispielcode deines Projektes posten? Vielleicht fällt mir ja ein Unterschied auf.

[edit]
Oder mal die Sachen aus dem Formular die die Connection betreffen? Vielleicht habe ich ja im OI was falsch eingestellt oder vergessen. Das ganze Objekt wird nämlich über den OI sozusagen "initialisiert", will heissen da stehen alle wichtigen Sachen drin.
[/edit]

sirius 5. Mär 2008 15:47

Re: ADO Connection in DLL -> .Open = Fehler
 
Bei mir geht nix über OI:
Delphi-Quellcode:
function TestFirstLastValue(FileName:Pchar; ConnStr:PChar; Messort:pchar; Laenge:integer) :integer; //wird exportiert
var Daten:Tmessdaten;
    mo,name,cstr:string;
    DB:TAdoConnection;
    query:TAdoquery;
    id_kanal,id_zeit,a:integer;
    tab:string;
    vgl:double;
    res:boolean;
begin
  res:=false;
  id_kanal:=0;
  try
    if not initeinstellungen(connstr) then
      raise Exception.Create('Fehler beim Lesen der Einstellungen aus der Datenbank');
...
end;

function InitEinstellungen(ConnStr:Pchar):boolean;
var cstr:string;
    DB:TAdoConnection;
    Query:TadoQuery;
    s,w:string;
    z:int64;
begin
  result:=true;
  if einstellunggeladen {globaler Boolean} then exit;
  cstr:=connstr;
  try
    Query:=nil;
    DB:=nil;
    try
      DB:=TAdoConnection.Create(nil);
      DB.ConnectionString:=cstr;
      DB.Open;
      Query:=TAdoQuery.Create(nil);
      Query.Connection:=DB;
      DBAfterConnect(query);

...
end;
TestFirstLastValue wird exportiert und auch als erstes aufgerufen,

mika 6. Mär 2008 09:14

Re: ADO Connection in DLL -> .Open = Fehler
 
hmm :/

dann muss ich mal schauen am wochenende wollte ich mich mal wieder davor setzen und mal sehen. Wenn das ganze bei dir funktioniert muss das bei mir ja auch irgendwie klappen :-D Vielleicht probiere ich auch mal die Instanz der Connection zur Laufzeit zu erstellen und den ganzen Connectionkram und so mitzugeben... Vielleicht funktioniert das hier ja besser.

Danke erstmal!! ich meld mich nach dem Wochenende mal wieder.

mika 17. Mär 2008 18:15

Re: ADO Connection in DLL -> .Open = Fehler
 
Soooo nach langem suchen habe ich den Fehler endlich gefunden :-D

Also: Man darf die Initialisierung der adoConnection NICHT in die Initialisierung der DLL einbauen.

Ich habe einfach eine weitere Methode exportiert die die Datenbankverbindung aufbaut die ich aufrufen
kann nachdem die DLL geladen wurde. Dann funktionierts auch mit der DB ;-)


Liebe Grüße, Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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