AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?
Thema durchsuchen
Ansicht
Themen-Optionen

Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

Ein Thema von TiGü · begonnen am 21. Aug 2014 · letzter Beitrag vom 18. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#1

Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 12:31
Hallo Gemeinde,

ich wollte den Threadtitel schon in "Waaas für Praktikanten arbeiten bei Emba?" benennen, fand es dann aber doch zu unsachlich.

Meine Kollegen arbeiten mit den C++Builder XE3 an einem VCL-Formular mit aktiviertem VCL Style unter 64-Bit.
Bei Verwendung des Stylings und einer TToolBar kam es unter bestimmten Umständen zu obskuren Access Violations, hier ein CallStack-Beispiel:
Code:
:00007FF956748A23 ; C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.9600.16384_none_34a8918f959016ea\COMCTL32.DLL
:00007FF95674C948 ; C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.9600.16384_none_34a8918f959016ea\COMCTL32.DLL
:0000000000a81178 ; Vcl::Imglist::TCustomImageList::SetNewDimensions(unsigned long long)
:0000000000a81294 ; Vcl::Imglist::TCustomImageList::SetHandle(unsigned long long)
:0000000000b8bb0e ; Vcl::Comctrls::TToolBarStyleHook::ApplyImageList()
:0000000000b8be52 ; Vcl::Comctrls::TToolBarStyleHook::Paint(Vcl::Graphics::TCanvas*)
:0000000000a59bf5 ; Vcl::Themes::TStyleHook::WMPaint(Winapi::Messages::TMessage&)
:0000000000cddaa1 ; System::TObject::Dispatch(void*)
Das sorgte auch dafür, das die Icons in den TToolButtons nicht richtig gesetzt bzw. verschoben dargestellt wurden.

Beim Debuggen des ToolBar-StyleHooks ist mir die folgende Stelle aufgefallen:

Delphi-Quellcode:
procedure TToolBarStyleHook.ApplyImageList;
var
  H: Cardinal; // <--- Was zum Kuckkuck ist das?
begin
  H := SendMessage(Handle, TB_GETIMAGELIST, 0, 0);
  if (H <> 0) and (FImages = nil) then
  begin
    FImages := TImageList.Create(nil);
    FImages.ShareImages := True;
    FImages.Handle := H;
  end;
end;
Warum wird hier ein fester Cardinal verwendet, anstatt ein HImageList?
Das kann ja wohl nicht wahr sein...

Ist das in XE6 gefixt?
Unter XE5 (beim Kollegen geschaut) ist der falsche Datentyp noch da.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#2

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 12:37
Zitat:
Delphi-Quellcode:
type
  THande = type Cardinal;
Vielleicht ist das noch ein "Übersetzungsfehler" aus dem Win32.

Oder man hätte da auch LRESULT als Typ verwenden können.


Oder wie wäre es damit?
Delphi-Quellcode:
procedure TToolBarStyleHook.ApplyImageList;
begin
  if not Assigned(FImages) then
  begin
    FImages := TImageList.Create(nil);
    FImages.ShareImages := True;
  end;
  FImages.Handle := SendMessage(Handle, TB_GETIMAGELIST, 0, 0);
end;

Seit wann gibt es TToolBarStyleHook eigentlich und warum verwendet sonst keiner Win64?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Aug 2014 um 12:41 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 12:49
Ohne Zweifel ist der Datentyp falsch, dennoch bleiben derartige Handles auch bei einem 64bit-Windows Zahlenwerte von 32bit. MSDN schreibt ausdrücklich, dass es sicher ist, die obere 32 Bit abzutrennen, wenn eine 32bit-Anwendung ein solches Handle erhalten soll.
Nichts anderes wird der Compiler bei o.g. Aufruf machen (können), weil der Zieldatentyp nichts anderes hergibt.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 13:09
Seit wann gibt es TToolBarStyleHook eigentlich und warum verwendet sonst keiner Win64?
Na, frühstens zusammen mit den 64-Bit Compiler in XE2.
Daher gibt es auch keine Entschuldigung, dass es hier an der Stelle falsch gemacht wurde.

Ich persönlich war in meinen 64-Bit Delphi-Programm auch gar nicht betroffen, aber die C++Builder-Leute haben geflucht und gejammert.
Letztendlich läuft es darauf hinaus, dass ich den Style-Hook kopiert habe, die entsprechende Stelle gefixt und diesen eignen Hook anstatt des normalen per TCustomStyleEngine.RegisterStyleHook() anmelde.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 13:11
MSDN schreibt ausdrücklich, dass es sicher ist, die obere 32 Bit abzutrennen, wenn eine 32bit-Anwendung ein solches Handle erhalten soll.
Und eine 64-Bit-Anwendung?
Ist es da auch sicher?
Ich denke eher nicht!
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 14:07
Nun, Handles lassen sich zwischen Prozessen austauschen - insbesondere auch zwischen 64bit- und 32bit-Prozessen. Da Windows nicht wissen kann, was Du mit dem Handle anstellen wirst, kann es eigentlich nur ein 32bit-kompatibles Handle sein, dass da ausgestellt wird.
Ich muss mal schauen, ob ich die Unterlagen und Quellen wiederfinde. Tenor von MS war: "Der Wertebereich von 32bit langt für den Zweck."
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 14:34
Könnte trotzdem jemand mal bitte in seinen XE6 VCL-Sourcen nachgucken? Das wäre lieb!
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 14:41
Ist weiterhin als "Cardinal" deklariert.
Delphi XE6 20.0.15596.9843.


//edit: Ich sehe mal zu, heute Abend einen QC-Eintrag dafür zu erstellen.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#9

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 15:03
Wobei die 4 Milliarden Handles auch reichen sollte.

OK, oftmals sind das auch nur gekastete Pointer/ListenIndize, aber selbe bei der Beachtung von Signed und einem 8er Align, wären das immernoch über 268 Millionen und wie man das gerne bei den GDI-Handles sieht, sind die schon lange vorher "alle", womit der Wertebereich also locker reicht.

Einige Handle sind ja intern immernoch auf WORD begrenzt. Vielleicht ändert sich das mal, jetzt wo das 16-Bit-Subsystem langsam verschwindet.



Das Problem ist nun also, wenn der Code so im Prinzip eigentlich doch stimmt ... Warum knallt es hier nun eigentlich?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Aug 2014 um 15:08 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Was steht unter XE6 in Vcl.ComCtrls.TToolBarStyleHook.ApplyImageList?

  Alt 21. Aug 2014, 16:29
Das Problem ist nun also, wenn der Code so im Prinzip eigentlich doch stimmt ... Warum knallt es hier nun eigentlich?
Das frage ich mich auch!
Aber ich sehe halt, das mit entsprechenden Fix die Probleme in den C++Builder-VCL-Formularen verschwinden.

Kann es damit zu tun haben, dass wir in einer C#-WPF-Anwendung die C++-VCL-Formulare eingebettet haben?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:47 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