![]() |
DLL - Form Problem
Moin hab grad probiert eine Form folgendermaßen in eine DLL zu quetschen:
Delphi-Quellcode:
:wiejetzt:
function KarteiAdmin(parent: Pointer;nr:integer;
curUserID:integer): boolean; stdcall; begin try AdminKartei(parent,patnr); finally end; end; function AdminKartei(parent: Pointer; nr:integer):boolean; begin if Assigned(parent) then begin ShowMessage('geht los'); frmKarteiAdmin := TfrmKarteiAdmin.Create(nil); try frmKarteiAdmin.SetParent(parent); frmKarteiAdmin.ibtr.DefaultDatabase := db; frmKarteiAdmin.SetPatnr(patnr); frmKarteiAdmin.ShowModal; finally frmKarteiAdmin.Free; end; end end; procedure TfrmKarteiAdmin.FormCreate(Sender: TObject); var pc: PChar; begin // Modul anzeigen GetMem(pc, MAX_PATH); if Assigned(pc) then try ZeroMemory(pc, MAX_PATH); GetModuleFileName(hInstance, pc, MAX_PATH); showmessage(string(pc)); finally FreeMem(pc); end else showmessage('Konnte Modulnamen nicht ermitteln.'); end; das ganze lass ich dann so wieder aufrufen:
Delphi-Quellcode:
Mein Problem ist das beim Aufruf das Form nicht angezeigt wird und beim FreeLibrary gibts ne Exception... :wall:
function CheckKartei:boolean; //addieren(zahl1, zahl2: integer): integer;
var KarteiAdmin: TKarteiAdmin; Handle: THandle; begin Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'daKarteiAdmin.dll')); if Handle <> 0 then begin @KarteiAdmin := GetProcAddress(Handle, 'KarteiAdmin'); if @KarteiAdmin <> nil then result:=KarteiAdmin(nil,1,0); try FreeLibrary(Handle); except end; end; end; Kann mir jemand sagen wo das Problem liegt :gruebel: ? |
Re: DLL - Form Problem
probier mal diese stelle
Delphi-Quellcode:
durch
frmKarteiAdmin := TfrmKarteiAdmin.Create(nil);
Delphi-Quellcode:
zu tauschen.
frmKarteiAdmin := TfrmKarteiAdmin.Create(Self);
|
Re: DLL - Form Problem
Wie ist KarteiAdmin definiert?
|
Re: DLL - Form Problem
>> Wie ist KarteiAdmin definiert?
Delphi-Quellcode:
TKarteiAdmin = function(parent: Pointer;nr:integer;
curUserID:integer): boolean; stdcall; |
Re: DLL - Form Problem
Verwendest Du Laufzeitpackages?
Falls nein:
Delphi-Quellcode:
ist nicht erlaubt, da (zum 1000. mal) ohne Laufzeitpackages du zwei unabhänige Klassenbibliotheken in der DLL und der Exe hast und TObject in DLL <> TObject Exe und jeder Vergleich mit xxx as TKlasse und xxx is TKlasse fehlschlägt.
frmKarteiAdmin.SetParent(parent);
Sollte aber erst m.E. Krachen wenn du kein nil als Zeiger übergibst. Irgendjemand (Forensuche bemühen) hat mal eine Lösung gepostet die Halbwegs funktionieren sollte. Also probiers mal mit Laufzeitpackages. |
Re: DLL - Form Problem
Hallöchen fwsp,
Delphi-Quellcode:
hat keinen Parent... also würde self nix gehen... :cat:
function AdminKartei(parent: Pointer;
nr:integer):boolean; |
Hallo Bernhard,
Hallo Bernhard,
Laufzeitpackages ? Nö. Also das: "frmKarteiAdmin.SetParent(parent);" kracht eigendlich nicht - habs aber mal auskommentiert... und ändert gar nichts... Und im Tutorial von Assarbad ist dat so beschrieben... ![]() Seite 16 und 17... >>Also probiers mal mit Laufzeitpackages. naja, wollt grad herausfinden wie es mit DLLs geht ;-) |
Re: Hallo Bernhard,
Zitat:
|
Re: DLL - Form Problem
Hallo,
an welcher Stelle knallt es denn ? eine DLL kann man auch debuggen... Setz mal nen Breakpoint auf frmKarteiAdmin := TfrmKarteiAdmin.Create(nil); und trage als Start-Parameter deine Exe ein. Auf jeden Fall würde ich diese globale Form-Variable löschen, spätestens, wenn zwei Programme auf die DLL zugreifen, knallt es wieder.
Delphi-Quellcode:
Was hier interessant ist, ist das function AdminKartei(nr:integer):boolean; var frmKarteiAdmin : TfrmKarteiAdmin. begin frmKarteiAdmin := TfrmKarteiAdmin.Create(nil); try frmKarteiAdmin.ibtr.DefaultDatabase := db; frmKarteiAdmin.SetPatnr(patnr); frmKarteiAdmin.ShowModal; finally frmKarteiAdmin.Free; end end; frmKarteiAdmin.ibtr.DefaultDatabase := db; Was ist db ? Bei Dlls + Interbase solltest du nachmal nachlesen (CloneHandle oder sowas ähnliches.) Ausserdem meckert dein Compiler, dass der Rückgabewert unbestimmt ist .. Heiko |
jeht jetzt...
Hi Hoika,
>> an welcher Stelle knallt es denn ? jetzt nur noch beim entladen der DLL >>eine DLL kann man auch debuggen... DANKE... das war der Tip den ich brauchte :bounce1: Ja DLLs debuggen... darauf muss man erst ma kommen... :angel2: >>Auf jeden Fall würde ich diese globale Form-Variable löschen, >>spätestens, wenn zwei Programme auf die DLL zugreifen, >>knallt es wieder. welche globale Form-Variable meinst Du denn jetzt ?
Delphi-Quellcode:
>>Was ist db ?
function AdminKartei(parent: Pointer;
db:TIBDatabase;patnr:integer):boolean; var frmKarteiAdmin : TfrmKarteiAdmin; begin //if Assigned(parent) then // is nich ... geht nich.... begin frmKarteiAdmin := TfrmKarteiAdmin.Create(nil); try frmKarteiAdmin.SetParent(parent); // is wieder drin und crasht nicht... frmKarteiAdmin.ibtr.DefaultDatabase := db; // Datenbank zuweisen frmKarteiAdmin.SetPatnr(patnr); frmKarteiAdmin.ShowModal; finally frmKarteiAdmin.Free; end; end end; ist TIBDatabase... hatte ich veressen im Bsp. rauzunehmen... >>Bei Dlls + Interbase solltest du nachmal nachlesen >>(CloneHandle oder sowas ähnliches.) Wo kann man darüber was nachlesen ? >>Ausserdem meckert dein Compiler, dass der Rückgabewert unbestimmt ist .. stimmt :dancer2: werde noch n result zurückgeben lassen... |
Re: DLL - Form Problem
Hallo,
ich meinte die frmXXX, aber das war in den anderen Posts schon als lokale Variable definiert. Bist du sicher, dass das FreeLibrary der Schuldige ist und nicht das FormDestroy ? Kommentiere mal das ganzen DB-Zeug aus, falls es damit klappt, nimm eine DLL-eigene TIBDataBase und erzeuge das Handle über CloneHandle (google) Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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