AGB  ·  Datenschutz  ·  Impressum  







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

Eine DLL freigeben. (CallBack)

Ein Thema von geskill · begonnen am 29. Jan 2008 · letzter Beitrag vom 30. Jan 2008
Antwort Antwort
Seite 3 von 3     123   
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#21

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 17:02
Hi,

ich glaube, dass hat nichts mit der "Haupt-Unit" (was immer das ist) zu tun, sondern, dass du die Konstante als privaten Klassenmember deklariert hast. Somit ist sie nur innerhalb der Unit in der sie deklariert ist verfügbar. Ich deklariere diese Sachen immer global. Macht auch irgentwie mehr Sinn, denn ich sende solche Botschaften in der Regel von anderen Formularen.

Gruß oki
42
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#22

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 18:00
Ein paar Anmerkungen:

- Diese Konstantendefinition für die Message kann sonstwo stehen, du kannst diese einmal in der Hauptunit deklarieren und dann nochmal in der DLL. Problem ist einfach nur, dass du bei einer Änderung der Message ID zwei Quellen aktualisieren musst und somit eine Fehlerquelle mehr vorhanden ist. Abhilfe schafft hier am besten wie von oki vorgeschlagen, eine Unit zu bauen, welche im Interface Abschnitt einfach nur diese Konstantendefinition enthält und dann vom Formular der App genauso angezogen werden kann wie von der DLL.

- Du benutzt beim Aufruf der DLL die globale Variable der Mainform innerhalb ihrer eigenen Methode. Das ist böse, sehr böse. Übergebe das Handle direkt, schliesslich befindest du dich in der Methode des Form, somit einfach nur Handle beim Aufruf oder halt Self.Handle, aber nicht mainform.Handle.

- Ich verstehe den Kommentar zu dem Library Handle Field in der Mainform Klasse nicht. Warum muss das eine static var sein? Hast du mehrere Mainforms?

- Warum hast du das Mainform Handle als globale Variable innerhalb der DLL abgelegt und nicht als Member in dem Formular an sich? Schliesslich weist du den Member innerhalb der Methoden zu und benutzt ihn ausschliesslich innerhalb der Klasse.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#23

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 18:46
1: das habe ich nur halb verstanden :-( also ich kann eine konstante in der laufzeit doch nicht verändern.

2: beim aufruf von Self.Handle oder Handle wird die DLL nicht freigegeben (Das habe ich jedenfalls im Debugger gesehen). Bessere Lösung die auch funktioniert ?

3: ne in diesem Beispiel nicht

4: klar hätte ich das auch in den public Teil packen können, private wäre problematisch da CreateDLL nicht in einer Klasse sein darf, jedenfalls habe ich das noch nicht geschaft, also damit das im Export teil klappt...

EDIT: Bischen doof das man den Titel nach 24h nicht mehr ändern kann, weil CallBack passt zwar noch aber PostMessage oder Windows Message etc. wäre "richtiger"...
Sebastian
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#24

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 19:42
Hi,

Muetze meint folgendes:
1.
Delphi-Quellcode:
type
  TMainForm = class(TForm)
    bDllLaden: TButton;
    bClose: TButton;
    procedure bCloseClick(Sender: TObject);
    procedure bDllLadenClick(Sender: TObject);
  private
    // die Variable muss global gespeichert werden damit FreeLibrary ein Ziel hat
    class var hLib:cardinal;
    const
      wm_FreeMyLibrary = wm_User + 100; /// hier nicht
  public
so:
Delphi-Quellcode:
unit My_Types;

interface

const
  wm_FreeMyLibrary = wm_User + 100;
........


implementation
end;
So ist deine Konstante global definiert und gilt in allen Units deines Projektes in denen du unter uses My_Types angibst.

2.
Delphi-Quellcode:
   // nun wird zusätzlich das handle übergeben, was später benötigt wird
   THEN Mcreatedll(self.Handle);
Wenn du hier die globale Variable benutzt (die delphi immer automatisch mit anlegt), dann kann es passieren, dass diese nicht definiert ist. Das ist vor allem dann der Fall, wenn du an anderer Stelle die Form kreierst und da eine andere Variable verwendet wird. Mache ich immer bei Formularen, die ich zur Laufzeit erstelle. Dann lösche ich im Projekt sogar die globale Variablendeklaration um sie nicht versehentlich zu verwenden.
Man sollte es sich eh angewöhnen immer self und nicht eine Objektvariable in der Klasse für den Zugriff auf eigene Eigenschaften und Methoden zu verwenden.

Jo, das war mein Teil dazu.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#25

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 19:48
Ah... jetzt hab ich's gerafft... danke :thumb:
Sebastian
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#26

Re: Eine DLL freigeben. (CallBack)

  Alt 30. Jan 2008, 21:27
Joa, ist ja nun schon alles geklärt. Zu dem 4. Punkt: ich habe mich geirrt und übersehen bzw. nicht dran gedacht, dass CreateDLL() natürlich klassenlos ist und somit hast du natürlich vollkommen Recht. Ich ziehe meinen 4. Punkt wegen Unsinn am Code zurück...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 19:08 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