![]() |
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... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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