![]() |
Datenbank: Microsoft Access-Datenbank • Zugriff über: Mit ADOQuery und ADOConnection
ADOQuery in DLL spinnt
Liste der Anhänge anzeigen (Anzahl: 1)
Hi DPler
Ich hab ein großes Problem. Ich ein Programm geschrieben das auf die Datenbank zugegriffen hat. Alles wunderbar. Bis ich mich entschied alles in eine DLL zu packen. Naja jetzt ist alles in der DLL und er bringt nur noch Fehler. Ich habe ja nichts vom Code geändert ist jetzt alles was die Datenbank angeht in die DLL gepackt. Jetzt kommt der Witz dabei der Fehler tritt auf nachdem er die procedure SQLBefehl 8-10 durch hat. Es ändert sich der SQL befehl nicht einmal. Und wo des ganze im Programm war hat alles wunderbar funktioniert :wall:
Delphi-Quellcode:
procedure SQLBefehl(SQL : String); stdcall;
begin ADOQuery.Active := false; ADOQuery.SQL.Clear; ADOQuery.SQL.Add(SQL); <--- Hier kommt der Fehler. Im Anhang ADOQuery.Active := true; end; function QueryData(FeldName : String) : Variant; stdcall; begin result := ADOQuery[FeldName]; end; exports SQLBefehl, QueryData; begin ADOQuery := TADOQuery.Create(nil); ADOConnection := TADOConnection.Create(nil); ADOQuery.Connection := ADOConnection; ADOConnection.ConnectionString := cADOConnectionString; ADOConnection.Mode := cmShareExclusive; ADOConnection.Provider := 'MSDASQL.1'; end. |
Re: ADOQuery in DLL spinnt
Mache aus der DLL ein Package und du kannst sogar Strings nehmen. Außerdem wird die VCL bei einer Delphi EXE + Delphi DLL zweimal geladen. Packages sind Delphis ClassLibs, DLLs sollten IMHO nur benutzt werden wenn man auch mit anderen Sprachen auskommen will.
|
Re: ADOQuery in DLL spinnt
ich will aus verschiedenen Gründen eine DLL benutzen
also mein prob. warum funkt des nicht |
Re: ADOQuery in DLL spinnt
Hallo!
Hast Du daran gedacht, die Unit ShareMem als erste Unit aufzunehmen? Das ist bei String-Parametern in einer DLL nötig (jedenfalls bei früheren Delphi-Versionen). Beim Erzeugen einer neuen Unit sollte das auch da drin stehen. Alternative: PChar oder ShortString verwenden. Gruß Dietmar Brüggendiek |
Re: ADOQuery in DLL spinnt
ja aber warum kann des der fehler sein?
wenn ich debuge wird der string ja wunderbar übergeben :wall: Ich ich werds mal mit PChar probieren //edit: Danke :thumb: Jetzt funktionierts :-D, ich verstehs trotzdem nicht warum :stupid: (kann mir jemand des erklären? würd mich interessieren) |
Re: ADOQuery in DLL spinnt
Du musst das COM-Subsystem mit CoInitialize(nil); vor dem Verwenden von COM-Objecten in DLLs initialisieren, und beim Entladen der DLL wieder mit CoUnInitialize; aufräumen. Bei multithreaded Anwendungen sollte in jedem Thread ein CoInitialize/CoUnInitialize Paar in der Execute-Methode stehen.
use ActiveX (bzw. OLE2 in älteren Delphi-Versionen) ShareMem wird eigentlich nur benötigt, wenn man in extern deklarierten Funktionen Delphi-Strings verwenden will. |
Re: ADOQuery in DLL spinnt
und für was braucht man des CoInitialize bzw. CoUnInitialize? :wiejetzt:
|
Re: ADOQuery in DLL spinnt
Liste der Anhänge anzeigen (Anzahl: 1)
:wall:
Ich hab des jetzt alles wunderbar zum laufen gebracht auch ohne CoInitialize(nil); Naja und plötzlich (ohne des ich beim laden der DLL oder bei der DLL selbst etwas verändert hab) kann er diesen Befehl nicht mehr ausführen:
Delphi-Quellcode:
Fehler: im Anhang
ADOQuery := TADOQuery.Create(nil);
Das einzige was ich beim Prog. verändert hab war das ich eine TWebBrowser kompo gelöscht habe (hat nichts mir der Datenbank zu tun). Auch wenn ich sie wieder hinzufüg dann gehts nicht mehr :wall: |
Re: ADOQuery in DLL spinnt
*push*
|
Re: ADOQuery in DLL spinnt
*push²*
|
Re: ADOQuery in DLL spinnt
Wie wäre es wenn Du mike2's Tipp mit CoInitialize(nil) wieder einbauen würdest?
|
Re: ADOQuery in DLL spinnt
hab ich natürlich gleich nach dem Fehler ausprobiert (bevor ich gepostet hab) => ohne erfolg
|
Re: ADOQuery in DLL spinnt
Ist ADOQuery überhaupt schon angelegt?
Deine erste Fehlermeldung deutet darauf hin das du irgendwo mit einem nil-Zeiger/referenz arbeitest. |
Re: ADOQuery in DLL spinnt
das anlegen ist ja genau des prob.
wenn ich
Delphi-Quellcode:
aufrufe dann tritt der fehler auf.
ADOQuery := TADOQuery.Create(nil);
Des hat ja schon alles wunderbar funktioniert aber auf einmal ... |
Re: ADOQuery in DLL spinnt
der twebbrowser hat coinit aufgerufen.
du musst das tun. sonst laeuft das com nicht. das ado unter delphi hat ein multithreadingproblem wenn du die selbe connection nutzt. probier mal das sharemem aufzurufen und/oder das tadobla.create in einen mutex/criticalsection zu packen |
Re: ADOQuery in DLL spinnt
hast du dran gedacht, den speicher bei den funktionen und prozeduren wieder freizugeben? wenn du das nicht machst fallen die reihenweise aufer schnauze, vo speicherverbrauch mal ganz abgesehen. die gilt insbesondere für die rückgabewerte von funktionen. die methode entspricht dem malloc aus c++ und ist bei dll's immer angeraten.
etwa so: func blabla(paramlist): output; var par: ^output; begin new(par); // hier dein code ^par:= result; Result:= ^par; free(par); end; bei dem interbase-paket ist ein entsprechendes bsp zu finden. |
Re: ADOQuery in DLL spinnt
@generic:
Delphi-Quellcode:
hab ich ja schon probiert
CoInitialize(nil);
ADOQuery := TADOQuery.Create(nil); sharmem benutzt ich nicht mutex? criticalsection? @hardy1234: Ahm was hat des mit meinem prob. zu tun? :wiejetzt: |
Re: ADOQuery in DLL spinnt
:wall: ich versteh die welt nicht mehr
plötzlich geht das erstellen von der ADOQuery Nur geht der Befehl:
Delphi-Quellcode:
nicht mehr. *grml*
ADOConnection.Open;
Aber des nur auf meinen Laptop, bei meinem normallen PC gehts. Der ODBC Treiber ist aber installiert und es hat ja schon funktioniert. Könnt ihr mir bitte helfen? |
Re: ADOQuery in DLL spinnt
*push*
|
Re: ADOQuery in DLL spinnt
Zitat:
Ich glaube es wäre mal an der Zeit eine kleine Testanwendung zu schreiben. Ich weiß absolut nicht mehr was du aktuelle an den Tipps eingebaut hast bzw. was Du geändert hast. Sonst reden wir aneinander vorbei. |
Re: ADOQuery in DLL spinnt
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
|
Re: ADOQuery in DLL spinnt
Zitat:
|
Re: ADOQuery in DLL spinnt
aha des sagt mir jetzt gar nichts kannst du mir des bitte genauer erklären.
bzw. code beispiele |
Re: ADOQuery in DLL spinnt
*push*
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 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 by Thomas Breitkreuz