AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein DLL Einbindung - Fehler beim Beenden
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Einbindung - Fehler beim Beenden

Ein Thema von fsc · begonnen am 1. Aug 2006 · letzter Beitrag vom 15. Sep 2006
Antwort Antwort
Seite 2 von 3     12 3      
fsc

Registriert seit: 12. Sep 2005
22 Beiträge
 
#11

Re: DLL Einbindung - Fehler beim Beenden

  Alt 2. Aug 2006, 11:28
Delphi-Quellcode:
library Aenderungsinfo;
uses
  ShareMem,
  SysUtils,
  Dialogs,
  StdCtrls,
  Forms,
  Classes,
  Grids,
  kbmMemTable,
  uSOAPClient,
  QGraphics,
  Controls;

{$R *.res}

procedure benutzerdetails_anzeigen(provider,eindeutiges_feld,aktueller_eintrag,aktueller_eintrag_detail:string);stdcall; export;
var
  Form1:TForm;
  StrGr_Aenderung:TStringgrid;
  SoapManager:TSoapManager;
  SMT_Table:TSoapMemTable;
begin
  Form1:=TForm.Create(nil);
  Form1.Caption:='Datensatzdetails: '+aktueller_eintrag+' - '+aktueller_eintrag_detail;
  Form1.Position:=poScreenCenter;
  Form1.BorderStyle:=bsdialog;

  SoapManager:=TSoapManager.Create(nil);
  SoapManager.Active:=True;
  SMT_Table:=TSoapMemTable.Create(nil);
  SMT_Table.SOAPManager:=SoapManager;
  SMT_Table.ProviderName:=provider;
  SMT_Table.Active:=True;
  SMT_Table.Filtered:=True;
  SMT_Table.Filter:=eindeutiges_feld+'='''+aktueller_eintrag+'''';
  SMT_Table.Refresh;

  Form1.Height:=80;
  Form1.Width:=410;
  StrGr_Aenderung:=TStringgrid.Create(nil);
  with StrGr_Aenderung do
  begin
    Parent:=Form1;
    DefaultRowHeight:=20;
    Align:=alClient;
    if Form1.Height - Form1.ClientHeight > 28 then Form1.ClientHeight:=40 else Form1.ClientHeight:=45;//Form1.ClientHeight - (ClientHeight - Height);
    Form1.Width:=410;

    ColCount:=4;
    ColWidths[1]:=110;
    ColWidths[2]:=100;
    ColWidths[3]:=110;
    ColWidths[0]:=Width - ColWidths[1] - ColWidths[2] - ColWidths[3] - 7;
    RowCount:=2;
    FixedCols:=0;
    Cells[0,0]:=' Anlage von:';
    Cells[1,0]:=' Anlagedatum:';
    Cells[2,0]:=' Änderung von:';
    Cells[3,0]:=' Änderungsdatum:';
    Cells[0,1]:=SMT_Table.FieldbyName('benutzer_neu').asstring;
    Cells[1,1]:=SMT_Table.FieldbyName('datum_neu').asstring;
    Cells[2,1]:=SMT_Table.FieldbyName('benutzer_aend').asstring;
    Cells[3,1]:=SMT_Table.FieldbyName('datum_aend').asstring;
    StrGr_Aenderung.Options:= [goFixedHorzLine, goFixedVertLine, goHorzLine, goVertLine];
    SMT_Table.Destroy;
    SoapManager.Destroy;
  end;
  try
    Form1.Update;
    Form1.ShowModal;
  finally
    Form1.Destroy;
   end;
end;

exports
  benutzerdetails_anzeigen;
Der Datenbankzugriff erfolgt über die SoapMemTable bzw SoapManager.

Im Hauptprogramm befindet sich ein ganz gewöhnlicher Prozedurenaufruf. Der Implementationteil steht bereits oben. Sharemem ist erster Eintrag in der uses Liste.
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#12

Re: DLL Einbindung - Fehler beim Beenden

  Alt 2. Aug 2006, 11:55
Hallo!

Du solltest Deine Objekte grundsätzlich nicht über Destroy sondern über Free zerstören. Free gibt nämlich auch den Speicher wieder frei.

Außerdem hast Du StrGr_Aenderung nicht zerstört.

Anbei nochmal Dein Code, mit Free. Ich habe außerdem das try-finally-Konstruct umgebaut, damit auch wirklich alles freigegeben wird.

Delphi-Quellcode:
library Aenderungsinfo;
uses
  ShareMem,
  SysUtils,
  Dialogs,
  StdCtrls,
  Forms,
  Classes,
  Grids,
  kbmMemTable,
  uSOAPClient,
  QGraphics,
  Controls;

{$R *.res}

procedure benutzerdetails_anzeigen(provider,eindeutiges_feld,aktueller_eintrag,aktueller_eintrag_detail:string);stdcall; export;
var
  Form1:TForm;
  StrGr_Aenderung:TStringgrid;
  SoapManager:TSoapManager;
  SMT_Table:TSoapMemTable;
begin
  Form1:=TForm.Create(nil);
  SoapManager:=TSoapManager.Create(nil);
  SMT_Table:=TSoapMemTable.Create(nil);
  StrGr_Aenderung:=TStringgrid.Create(nil);
  try
    Form1.Caption:='Datensatzdetails: '+aktueller_eintrag+' - '+aktueller_eintrag_detail;
    Form1.Position:=poScreenCenter;
    Form1.BorderStyle:=bsdialog;
    SoapManager.Active:=True;

    SMT_Table.SOAPManager:=SoapManager;
    SMT_Table.ProviderName:=provider;
    SMT_Table.Active:=True;
    SMT_Table.Filtered:=True;
    SMT_Table.Filter:=eindeutiges_feld+'='''+aktueller_eintrag+'''';
    SMT_Table.Refresh;

    Form1.Height:=80;
    Form1.Width:=410;

    with StrGr_Aenderung do
    begin
      Parent:=Form1;
      DefaultRowHeight:=20;
      Align:=alClient;
      if Form1.Height - Form1.ClientHeight > 28 then Form1.ClientHeight:=40 else Form1.ClientHeight:=45;//Form1.ClientHeight - (ClientHeight - Height);
      Form1.Width:=410;

      ColCount:=4;
      ColWidths[1]:=110;
      ColWidths[2]:=100;
      ColWidths[3]:=110;
      ColWidths[0]:=Width - ColWidths[1] - ColWidths[2] - ColWidths[3] - 7;
      RowCount:=2;
      FixedCols:=0;
      Cells[0,0]:=' Anlage von:';
      Cells[1,0]:=' Anlagedatum:';
      Cells[2,0]:=' Änderung von:';
      Cells[3,0]:=' Änderungsdatum:';
      Cells[0,1]:=SMT_Table.FieldbyName('benutzer_neu').asstring;
      Cells[1,1]:=SMT_Table.FieldbyName('datum_neu').asstring;
      Cells[2,1]:=SMT_Table.FieldbyName('benutzer_aend').asstring;
      Cells[3,1]:=SMT_Table.FieldbyName('datum_aend').asstring;
      StrGr_Aenderung.Options:= [goFixedHorzLine, goFixedVertLine, goHorzLine, goVertLine];
    end;
    Form1.Update;
    Form1.ShowModal;
  finally
    StrGr_Aenderung.Free; // fehlte ganz
    SMT_Table.Free;
    SoapManager.Free;
    Form1.Free;
   end;
end;

exports
  benutzerdetails_anzeigen;
Code ist ungetestet, da mir einige Units fehlen.

Hope it helps

onlinekater
Thomas Breitkreuz
  Mit Zitat antworten Zitat
fsc

Registriert seit: 12. Sep 2005
22 Beiträge
 
#13

Re: DLL Einbindung - Fehler beim Beenden

  Alt 2. Aug 2006, 14:48
situation unverändert...trotzdem super das du dir Zeit nimmst....
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#14

Re: DLL Einbindung - Fehler beim Beenden

  Alt 3. Aug 2006, 06:08
Forms in DLLs geht ueblicherweise schief.
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#15

Re: DLL Einbindung - Fehler beim Beenden

  Alt 3. Aug 2006, 09:05
jetzt bleibt Dir eigentlich nur noch, auszuprobieren, welche der verwendeten Komponenten den Fehler verursacht.
Einfach eine nach der anderen auskommentieren und gucken, wann der Fehler sich verdünnisiert.

@Robert Marquardt: Habe eigentlich noch keine Probleme mit Forms in DLLs gehabt.

Gruß

onlinekater
Thomas Breitkreuz
  Mit Zitat antworten Zitat
fsc

Registriert seit: 12. Sep 2005
22 Beiträge
 
#16

Re: DLL Einbindung - Fehler beim Beenden

  Alt 4. Aug 2006, 08:16
habe die Komponenten nach und nach entfernt, es tut sich nichts, falls ich eine Lösung finde werde ich sie selbstverständlich posten...
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#17

Re: DLL Einbindung - Fehler beim Beenden

  Alt 4. Aug 2006, 09:19
Zeig mal den Code, mit dem du die Funktion aufrufst.
Evtl. hast du da einen Fehler gemacht (z.B. fehlendes stdcall).
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
fsc

Registriert seit: 12. Sep 2005
22 Beiträge
 
#18

Re: DLL Einbindung - Fehler beim Beenden

  Alt 6. Aug 2006, 17:47
Morgen poste ich den anderen Code. ich benutze allerdings stdcall, wie oben bereits zu sehen:

procedure benutzer(Provider,feld,eintrag,einrag_detail:strin g)stdcall; external 'Aenderungsinfo.dll';

Mir ist nochwas eingefallen: Ich benutze in der Funktion mit dem Aufruf einmal getmem, welchen ich am Ende allerdings wieder freigebe...


mfg
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#19

Re: DLL Einbindung - Fehler beim Beenden

  Alt 6. Aug 2006, 20:57
Zitat von Robert Marquardt:
Forms in DLLs geht ueblicherweise schief.
Warum und was fuer Fehler meinst du denn da im Kongreten?
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#20

Re: DLL Einbindung - Fehler beim Beenden

  Alt 6. Aug 2006, 21:24
Zitat von Mackhack:
Zitat von Robert Marquardt:
Forms in DLLs geht ueblicherweise schief.
Warum und was fuer Fehler meinst du denn da im Kongreten?
Weil die DLL eine eigene Kopie der VCL enthält.
Natürlich sind auch alle globalen Variablen der VCL doppelt im Speicher. Application aus der DLL ist nicht Application aus der Anwendung.
Für sowas gibt nimmt man Packages statt DLLs und Ruhe ist.
Möglich wäre es vllt auch in DLL und Exe die RTL & VCL als Runtime package anzugeben, aber da kommt wahrscheinlich immer noch Käse raus. (Habe ich noch nicht probiert)
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.
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