AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dll Forms... oder ligt es nicht daran ??

Ein Thema von dor557 · begonnen am 18. Aug 2007 · letzter Beitrag vom 30. Aug 2007
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 14:43
erst mal meine dateien :

die Library :

Delphi-Quellcode:
library Kundendaten;


uses
  SysUtils,
  Classes,
  forms,
  kMain in 'kMain.pas{KundendatenF};
{$E dll}

{$R *.res}

Procedure PluginMain(Befehl : PChar; Parameter : Pointer); stdcall;
begin
  KundenDatenF := TKundenDatenF.Create(Application);
  try
    KundenDatenF.Show;
  finally
    KundenDatenF.Release;
  end;
end;

exports
 PluginMain;

begin
end.
so nun die KMain.pas :

Delphi-Quellcode:
unit kMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TKundendatenF = class(TForm)
    Button1 : TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  KundendatenF: TKundendatenF;

implementation

{$R *.dfm}

end.
das sind die Daten gewesen aus der DLL.

Nun mache ich in der Hauptanwendung Folgendes :
ich habe mir eine unit Plugins angelegt die so aussieht :

Delphi-Quellcode:
unit plugins;

interface
uses SysUtils, windows, Dialogs, forms;

type TPlugin = procedure(Befehl : PChar; Parameter : Pointer); stdcall;
procedure PluginMain(Befehl : PChar; Parameter : Pointer);

implementation

procedure PluginMain(Befehl : PChar; Parameter : Pointer);
var Plugin: TPlugin;
    Handle: THandle;
begin
  Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'..\lib\kundendaten.dll'));
  if Handle <> 0 then begin
    @Plugin := GetProcAddress(Handle, 'PluginMain');
    if @Plugin <> nil then begin
      Plugin(Befehl, Parameter);
    end;
    FreeLibrary(Handle);
  end;
end;

end.
und das Hauptfenster in der anwendung hat folgendes aussehen :

Delphi-Quellcode:
unit HostFenster;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
uses plugins;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  PluginMain('',nil);
end;

end.
jetzt sobald ich auf den Button1 klicke um das Plugin zu starten bekome ich folgenden Fehler (Keine Fehlermeldung)

Er erstellt das Formular. und das Verschwindet sogleich wieder.. Kann also nicht daran arbeiten.

Kann mir jemand sagen warum ?

gruss Sascha
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 14:58
Du gibst die DLL gleich nach dem Erstellen und dem Anzeigen der Form wieder frei. Dadurch wird auch das Formular beendet und existiert demzufolge auch nicht mehr.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 15:00
Zitat:
KundenDatenF.Release;
Das ist schon mal ganz schlecht. Denn dadurch wird das Formular erst beim nächsten Application.ProcessMessages oder der Haupt-Botschaftsschleife freigegeben. Zu der Zeit ist aber die DLL nicht mehr im Speicher.

Release sollte man nur in Event-Handlern benutzen, die in dem betroffenen Formular deklariert sind. Ansonsten .Free verwenden.
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 15:03
das
KundenDatenF.Release; Ändert nicht ans meinem Problem.

auch wenn ich das nicht da stehen habe schliesst er das gleich wieder....

Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 15:07
Versuch ohne Owner:TKundenForm.Create(nil);
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 15:14
Delphi-Quellcode:
procedure PluginMain(Befehl : PChar; Parameter : Pointer);
var Plugin: TPlugin;
    Handle: THandle;
begin
  Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'..\lib\kundendaten.dll'));
  if Handle <> 0 then begin
    @Plugin := GetProcAddress(Handle, 'PluginMain');
    if @Plugin <> nil then begin
      Plugin(Befehl, Parameter);
    end;
    FreeLibrary(Handle);
  end;
end;
Da liegt dein Problem. Deine Plugin-Routine macht nichts anderes als das Formular zu Erzeugen und anzuzeigen (im Speicherbereich der DLL). Danach springt sie zurück und du gibst die DLL frei (und damit auch das Formular). Was soll er also noch anzeigen ?

Formulare in DLL's ist eh eine sehr kritische Sache (such mal hier in der DP nach den Stichwörtern Plugin und Form).
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 15:20
was ich nicht verstehe warum wartet die anwendung nicht auf eine Bestätigung der dll das das Formular mit close oder release geschlossen wurde ??

Ich kann auf jeden fall nichts auf dem erstellten Formular anklicken. Auch wenn ich es als eine Funktion mache nicht.

Wollte mit ShowModal arbeiten aber sobald ich das verwende bekomme ich die meldung das aus einem Sichtbaren Formular kein Modales gemacht werden kann.

Auch mit
TKundenForm.Create(nil); bekomme ich eine Fehlermeldung.

Irgend wie komisch das ganze. werde nachher mal schauen nach dll form in der Suche. Aber wenn jemand eine Andre lösung hat bin ich Ganz Auge
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 15:35
Du brauchst auf jeden Fall ShowModal. Sonst wird das Formular ja direkt danach freigegeben. Versuch mal vor dem ShowModal noch ein Hide.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#9

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 16:06
Auch schon versucht. Geht auch nicht.

Keine ahnung was da nicht so funktioniert wie es soll...

Bin etwas am ende meines Lateins.
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Dll Forms... oder ligt es nicht daran ??

  Alt 18. Aug 2007, 16:08
Was heißt "geht nicht"? Selber Fehler würde mich wundern, da das Fenster ja versteckt wurde.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:31 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