Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL und Create (https://www.delphipraxis.net/86269-dll-und-create.html)

EWeiss 11. Feb 2007 23:20


DLL und Create
 
ich möchte gerne eine Create function in meiner DLL integrieren weiss aber nicht ob das geht.

Beim start der Dll möchte ich in DLL_PROCESS_ATTACH:
einen aufruf einbauen der aktionen ausführt die nur einmal beim start initialisiert werden dürfen.

Hab mir das so gedacht

Delphi-Quellcode:
BassVisMain.Create(Sender);
Hier schon das erste problem. Sender steht ja nicht zur verfügung

Die Classe selber sieht so aus.

Delphi-Quellcode:
TBASSVis = class(TComponent)
private

public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
end;

Var
BassVisMain        : TBassVis;

implementation

constructor TBASSVis.Create(AOwner: TComponent);
begin

end;

destructor TBASSVis.Destroy;
begin

end;
Delphi-Quellcode:
  procedure LibraryProc(Reason: integer);
  begin
    case (Reason) of
      DLL_PROCESS_ATTACH:
      begin
      BassVisMain.Create(Sender);
Generell die frage ob sowas in DLL's überhaupt möglich ist.
Wenn ja wie regel ich das mit 'Sender'

gruss Emil

Luckie 11. Feb 2007 23:22

Re: DLL und Create
 
Natürlich kann Klassen in DLLs nutzen. Schwierig wird es nur, wenn man aus der DLL eine Klassenreferenz zurückgeben will. Bei deinem konkrten Problem, übergib einfach nil als Wert für den Sender.

Elvis 11. Feb 2007 23:24

Re: DLL und Create
 
Die Sections initialization und finalization sind deine Freunde hier.
Haben auch den Vorteil, das der Code auch dann nach läuft wenn er in die Echse gelinkt wird. :zwinker:

EWeiss 11. Feb 2007 23:24

Re: DLL und Create
 
Zitat:

Zitat von Luckie
Natürlich kann Klassen in DLLs nutzen. Schwierig wird es nur, wenn man aus der DLL eine Klassenreferenz zurückgeben will. Bei deinem konkrten Problem, übergib einfach nil als Wert für den Sender.

Ja woher soll ich das wissen ob das in DLL_PROCESS_ATTACH: funktioniert
Hätte ja sein können das sich die DLL recursive aufruft.

Werde es mal mit nil versuchen.

EDIT:

Habs versucht... EAC error Anwendung kann nicht gestartet werden.
Springt auch nicht in Create rein :roll:

gruss

Elvis 11. Feb 2007 23:28

Re: DLL und Create
 
Zitat:

Zitat von EWeiss
Habs versucht... EAC error Anwendung kann nicht gestartet werden.
Springt auch nicht in Create rein :roll:

Kann auch unmöglich so gehen wie du es vorhat, da du Create auf die Referenz deines Typen anwendest, anstatt auf deinen Typen. Außerdem legst du die Instanz nirgends ab, wodurch du sie auch nicht freigeben kannst.

EWeiss 11. Feb 2007 23:28

Re: DLL und Create
 
Zitat:

Zitat von Elvis
Die Sections initialization und finalization sind deine Freunde hier.
Haben auch den Vorteil, das der Code auch dann nach läuft wenn er in die Echse gelinkt wird. :zwinker:

Habe im Thread oben unter Edit schon geschrieben das funktioniert nicht :oops:
Zumindest nicht so wie ich es mache.

gruss

Luckie 11. Feb 2007 23:31

Re: DLL und Create
 
Was Elvis meint:
Delphi-Quellcode:
var
  fs: TFileStream;
begin
  fs := TFileStream.Create(...);
Habe ich dich in letzter Zeit zu sehr mit VB(S) verdorben? :zwinker:

EWeiss 11. Feb 2007 23:32

Re: DLL und Create
 
Zitat:

Zitat von Luckie
Was Elvis meint:
Delphi-Quellcode:
var
  fs: TFileStream;
begin
  fs := TFileStream.Create(...);
Habe ich dich in letzter Zeit zu sehr mit VB(S) verdorben? :zwinker:

Kannst du mir das bitte erklären ? Bin ja eigentlich VB'ler und lerne noch.
Wo und für was soll ich as einsetzen.

EDIT:
In der Form gibt es ja ein create event was beim start nur einmal ausgeführt wird
sowas will ich in die DLL einbauen.

gruss

Luckie 11. Feb 2007 23:39

Re: DLL und Create
 
Delphi-Quellcode:
var
  fs: TFileStream; // Variable vom Typ TFileStream deklarieren. Hier wird unsere Objekt-Refrenz abgelegt
begin
  fs := TFileStream.Create(...); // Objekt erzeugen und Objektreferenz sichern
  try
    fs.MethodeXY; // eine Methode der Klasse TFileStream aufrufen
  finally
    fs.Free; // Objekt wieder zerstören
  end;
Was du wahrscheinlich gemacht hast:
Delphi-Quellcode:
var
  fs: TFileStream;
begin
  fs.Create(...);
Du hast eine Methode einer Klasse benutzt, ohne vorher die Klasse zu instanzieren / anzulegen. Es ist zwar der Konstruktor aber der Rest läuft ins Leere.

EWeiss 11. Feb 2007 23:48

Re: DLL und Create
 
Ich habe mir mal den aufruf TFileStream.Create(...); angesehen
dieser erwartet eine übergabe eines string und Mode : word

Vielleicht bin ich auch zu blöd ???
Finde den zusammenhang mit der von mir oben aufgeführten funktion nicht.
Und wie ich damit kommunizieren soll das es funktioniert.

Das ist mir noch etwas zu hoch :oops:

gruss

Luckie 12. Feb 2007 08:43

Re: DLL und Create
 
Ich habe nur die Klasse TFuileStream als Beispiel benutzt, um dir zu zeigen, wie man mit Klassen arbeitet und entsprechenden Objekte erzeugt. Das geht natürlich entsprechend mit deiner TBass-Dingsbums Klasse. ;)

EWeiss 12. Feb 2007 14:20

Re: DLL und Create
 
Zitat:

Zitat von Luckie
Ich habe nur die Klasse TFuileStream als Beispiel benutzt, um dir zu zeigen, wie man mit Klassen arbeitet und entsprechenden Objekte erzeugt. Das geht natürlich entsprechend mit deiner TBass-Dingsbums Klasse. ;)

Ok hab jetzt verstanden was du meinst. ;)
Habe mich schon gefragt wo der zusammenhang sein soll.

gruss

EWeiss 13. Feb 2007 17:31

Re: DLL und Create
 
Das initialisieren und die ausführung aus der Echse funktionieren jetzt.
Allerdings fehlt mir ein Handle was ich nicht so einfach übergeben kann.

zwei fragen..
1. TBASSVis.Create(AOwner: TComponent);

Initialisieren tue ich es über die funktion von außen.

Delphi-Quellcode:
function BASS_WINAMPVIS_INIT: boolean; stdcall;

begin
   try
     BassVisMain1 := TBassVis.Create(nil);
   finally
     BassVisMain1.Free
   end;

   result := True;
end;
Delphi-Quellcode:
BassVisMain1 : TBASSVis;
Eigentlich müßte ja TBassVis.Create(nil); = TBassVis.Create(self); sein
Geht aber nur wenn das Projekt als Echse ausgelegt ist.
was ist Self ? kann ich da nicht das Handle der ausführenden anwendung übergeben?

2.Das gleiche hier!
Wie komme ich an das Handle aus der Fremdanwendung und was ist das für eins?
(AOwner as TWinControl).Handle;
Scheint das Handle des Controls sein welches die Aktion ausführt beispiel das vom Start Button oder?

gruss Emil

marabu 13. Feb 2007 19:56

Re: DLL und Create
 
Hallo Emil,

mit Self erhältst du innerhalb einer Methode eines Objektes eine Referenz auf die Objektinstanz. Das ist manchmal ganz schön um Namenskonflikte aufzulösen oder um bei der Erzeugung von child components sich selbst als Owner übergeben zu können. Self ist genau der gleiche Wert den du erhältst, wenn du das Ergebnis eines Konstruktors an eine Variable zuweist. Über die Variable kannst du von außen auf das Objekt zugreifen, über Self von innen.

Freundliche Grüße

EWeiss 13. Feb 2007 20:18

Re: DLL und Create
 
Zitat:

Zitat von marabu
Hallo Emil,

mit Self erhältst du innerhalb einer Methode eines Objektes eine Referenz auf die Objektinstanz. Das ist manchmal ganz schön um Namenskonflikte aufzulösen oder um bei der Erzeugung von child components sich selbst als Owner übergeben zu können. Self ist genau der gleiche Wert den du erhältst, wenn du das Ergebnis eines Konstruktors an eine Variable zuweist. Über die Variable kannst du von außen auf das Objekt zugreifen, über Self von innen.

Freundliche Grüße

Mein Problem ist ganz einfach erklärt.
Du kennst das ja.

Habe jetzt aus BassVis eine EXE erstellt.
Alles aber auch alles funktioniert einwandfrei.

OpenGL Plugins usw...
Jetzt muss ich das teil wieder in die DLL einbauen und schon gibts probleme weil
sich da keine Form befindet.
Und die funktionen von außerhalb aufgerufen werden müssen.

Kann ja keine komplette classe/Object an die DLL übergeben.
Bekomme langsam die Krise...

Gruss Emil

Luckie 13. Feb 2007 22:39

Re: DLL und Create
 
Delphi-Quellcode:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.Caption := 'Kuckuck';
end;
Self ist hier das TForm Objekt, also Form1. Meist lässt man es aber weg, es sei denn man will deutlich machen, dass man mit einer Objekt-Instanz des Objektes selber arbeitet.

EWeiss 13. Feb 2007 22:56

Re: DLL und Create
 
Zitat:

Zitat von Luckie
Delphi-Quellcode:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.Caption := 'Kuckuck';
end;
Self ist hier das TForm Objekt, also Form1. Meist lässt man es aber weg, es sei denn man will deutlich machen, dass man mit einer Objekt-Instanz des Objektes selber arbeitet.

Ahhh jo das hat mir geholfen.
Is quasi das gleiche wie in VB 'Me'
me.caption = "Mein Window-Caption Name"

Jup jetzt klappt das ganze schon besser.
Danke für die ausführliche beschreibung ..

Gruss Emil

Luckie 13. Feb 2007 23:04

Re: DLL und Create
 
In VB heißt das me? Nein, ist das süß. :love: :mrgreen:

PS: Der Vollständigkeithalber, in C++ heißt es this.

EWeiss 13. Feb 2007 23:22

Re: DLL und Create
 
Zitat:

Zitat von Luckie
In VB heißt das me? Nein, ist das süß. :love: :mrgreen:

PS: Der Vollständigkeithalber, in C++ heißt es this.

Naja ab und zu kann auch etwas in VB süss sein :mrgreen: :zwinker:

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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