Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL - Form Problem (https://www.delphipraxis.net/76652-dll-form-problem.html)

spacewolf 7. Sep 2006 15:35


DLL - Form Problem
 
Moin hab grad probiert eine Form folgendermaßen in eine DLL zu quetschen:

Delphi-Quellcode:
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;
:wiejetzt:

das ganze lass ich dann so wieder aufrufen:

Delphi-Quellcode:
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;
Mein Problem ist das beim Aufruf das Form nicht angezeigt wird und beim FreeLibrary gibts ne Exception... :wall:

Kann mir jemand sagen wo das Problem liegt :gruebel: ?

fwsp 7. Sep 2006 15:37

Re: DLL - Form Problem
 
probier mal diese stelle
Delphi-Quellcode:
  frmKarteiAdmin := TfrmKarteiAdmin.Create(nil);
durch
Delphi-Quellcode:
  frmKarteiAdmin := TfrmKarteiAdmin.Create(Self);
zu tauschen.

Bernhard Geyer 7. Sep 2006 15:45

Re: DLL - Form Problem
 
Wie ist KarteiAdmin definiert?

spacewolf 7. Sep 2006 15:57

Re: DLL - Form Problem
 
>> Wie ist KarteiAdmin definiert?
Delphi-Quellcode:
TKarteiAdmin = function(parent: Pointer;nr:integer;
                        curUserID:integer): boolean; stdcall;

Bernhard Geyer 7. Sep 2006 16:11

Re: DLL - Form Problem
 
Verwendest Du Laufzeitpackages?
Falls nein:

Delphi-Quellcode:
frmKarteiAdmin.SetParent(parent);
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.
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.

spacewolf 7. Sep 2006 16:12

Re: DLL - Form Problem
 
Hallöchen fwsp,

Delphi-Quellcode:
function AdminKartei(parent: Pointer;
                     nr:integer):boolean;
hat keinen Parent... also würde self nix gehen... :cat:

spacewolf 7. Sep 2006 16:19

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...

http://www.michael-puff.de/Developer...l_tutorial.pdf

Seite 16 und 17...

>>Also probiers mal mit Laufzeitpackages.

naja, wollt grad herausfinden wie es mit DLLs geht ;-)

Bernhard Geyer 7. Sep 2006 16:48

Re: Hallo Bernhard,
 
Zitat:

Zitat von spacewolf
>>Also probiers mal mit Laufzeitpackages.

naja, wollt grad herausfinden wie es mit DLLs geht ;-)

Das eine schließt das andere nicht aus. Du kannst auch es als DLL belasen. U.u. mußt Du ShareMem noch einbinden wenns eine DLL bleibt.

hoika 7. Sep 2006 17:05

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:

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;
Was hier interessant ist, ist das
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

spacewolf 7. Sep 2006 18:48

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:
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;
>>Was ist db ?
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 23:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz