AGB  ·  Datenschutz  ·  Impressum  







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

TCollection = not TCollection ?

Ein Thema von EWeiss · begonnen am 6. Jul 2011 · letzter Beitrag vom 7. Jul 2011
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#1

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 00:00
Sekunde... Wessen self übergibst du, und warum ist das auf einmal ein Handle? Wenn du nicht gerade eine BPL (statt DLL) hast, und keinen Speicher rummappst, dann hast du in der DLL keinerlei Zugriff auf den Adressraum deiner Anwendung, und folglich auch keinen auf die Dinge, die die VCL so inne hat. Es mag sein, dass VB hier implizit mit COM Interfaces hantiert, so dass das alles rosig ausschaut, aber so ein Kissen hast du in Delphi nicht - zumindest nicht von Hause aus. Du könntest bestenfalls das (tatsächliche) Windows-Handle deines Formulares übergeben, und mittels FindWindowsEx() (also nackter WinAPI) die ChildControls durchgehen und an diesen, wiederum mit nackter WinAPI, Dinge tun. Aber die hübsche VCL Sicht wirst du so ohne Weiteres nicht in deine DLL geschoben bekommen.

Mir fehlt aber generell ein wenig "Vorarbeit" zu dem, was hier so insgesamt überhaupt alles passiert. DLL ist ja auch nicht immer gleich DLL. Hier scheint nen Hook zu sein, derer es auch wieder verschiedene Arten gibt. Was, wie, wer und vor allem gegen wen?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 7. Jul 2011 um 00:03 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 06:12
Also wenn ich hier ein Self übergebe

ComboHook.SetComboParentObj(self);
Ist es für mich ersichtlich das es sich nur um die MainForm handeln kann.
Da auf dieser die ganzen Komponenten aufgesetzt sind.

Delphi-Quellcode:
procedure THookedCombo.SetComboParentObj(Ctrl: TWinControl);
begin

  FParentObj := Ctrl;
end;
Das ParentHandle wäre also dann FParentObj.Handle

Mit diesem hole ich mir dann die Handles der auf self(MainForm) befindlichen Comboboxen über FindWindowExW
Aber wie gesagt es kommt nur die Hälfte von Self in der DLL an.
Das will irgendwie keiner so richtig verstehen was ich meine.

Zitat:
Aber die hübsche VCL Sicht wirst du so ohne Weiteres nicht in deine DLL geschoben bekommen.

Will ich auch nicht sondern nur das was in der Liste von Self steht
Du siehst aber das es geht ansonsten würdest du die Bitmaps nicht in den Comboboxen sehen können. (Ohne Hook)

gruss

Geändert von EWeiss ( 7. Jul 2011 um 06:17 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 17:04
Also wenn ich hier ein Self übergebe

ComboHook.SetComboParentObj(self);
Ist es für mich ersichtlich das es sich nur um die MainForm handeln kann.
Da auf dieser die ganzen Komponenten aufgesetzt sind.
Für mich nicht, weil aus dieser einen Zeile heraus nicht erkennbar ist, aus welchem Kontext heruas du diesen Aufruf machst, und grad self IST der Kontext . Wenn diese Zeile in einer Methode der MainForm steht, dann ja. Aber auch dann ist es eben nur ein Pointer, der im Adressraum der Anwendung Gültigkeit hat, nicht in der DLL. Wenn du zusätzlich noch das (tatsächliche) Handle in die DLL gibst, kannst du darüber natürlich via WinAPI Aufrufen arbeiten, weil DIE sind systemweit gültig.
Self ist kein Handle, sondern Idendisch mit z.B. dem, was ein TMyClass.Create() zurück liefert, und somit einfach eine Adresse auf den Heap, der wiederum im für nur deinen gerade aktiven Prozesses gemappten Speicher liegt, wo von aussen (ohne Tricks) keiner dran kommt. DLLs bekommen ihren eigenen Heap zugewiesen, und kommen an den der benutzenden Applikation nicht dran, ausser man kümmert sich von Hand darum, ooooder nutzt BPLs, wo sich ein von Delphi mit geliefertes "Framework" automatisch darum kümmert.
Ohne dies kennt die DLL die Struktur hinter dem gelieferten Pointer nicht (TForm ist eine Klasse der VCL, und all ihre Felder liegen ebenfalls im Adressraum der Anwendung), und selbst wenn man TForm der DLL bekannt machen würde und darauf casted, ist es noch immer ein ungültiger Pointer auf zufällige Daten im Adressraum der DLL.

Du musst zwischen Pointern und Handles unterschieden, ich glaube daher kommt deine Verwirrung. Das ist bei der VCL auch etwas gemischt, da hier Windows-Controls, die ein Systemhandle haben, mit VCL-eigenen Properties und Methoden gekapselt wird. Man kommt also via VCL Methoden (TForm.XXX()) ran, als auch über WinAPI Funktionen (SetWindowLong(MyForm.Handle, ...)). Erstere Möglichkeit fällt eben weg, wenn du den Adressraum deiner Anwendung verlässt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 7. Jul 2011 um 17:08 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 17:11
Ich habe das jetzt verworfen und übergebe die Komponenten direkt.

Delphi-Quellcode:
  for IComb := 0 to Form1.ComponentCount - 1 do
  begin
    Ctrl := Form1.Components[IComb];
    sCtrl := Ctrl.ClassName;

    If (sCtrl = 'TComboBox') or
       (sCtrl = 'TFilterComboBox') or
       (sCtrl = 'TDriveComboBox') then
    begin
      ComboHook := HookedCombo_Create;
      if assigned(ComboHook) then
      begin
        ComboHook.SetComboParentObj(TWinControl(Ctrl));
        ComboHook.ComboImg := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\Combo.png');
        ComboHook.FrameColor := $FED3AC;
        ComboHook.FrameHighLite := $666666;
        ComboHook.FrameStyle := FrameFlat;
        ComboHook.Connect;
      end;
    end;
  end;
Die Funktion ist dadurch gegeben wenn auch nicht so elegant wie ich es ursprünglich implementieren wollte.

Danke für deine Erklärungen.

PS:
Zitat:
Erstere Möglichkeit fällt eben weg, wenn du den Adressraum deiner Anwendung verlässt.
Muss da nochmal Nachhaken.

Wenn es so ist wie du sagst.
Müßte die Übergabe so wie sie jetzt von statten geht das gleiche sein.
So.. Dann erkläre mir mal warum ich hier die richtigen Handles bekomme ?
Wenn dem nicht so wäre würden sich die Bitmaps ja auf Irreguläre Positionen setzen
und keinerlei Events der Button funktionieren.

Auch hier bin ich außerhalb des Adressraums meiner Anwendung

gruss

gruss

Geändert von EWeiss ( 7. Jul 2011 um 17:36 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz