AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi LoadLibrary vs GetModuleHandle, eine Verständisfrage

LoadLibrary vs GetModuleHandle, eine Verständisfrage

Ein Thema von KodeZwerg · begonnen am 14. Mai 2021 · letzter Beitrag vom 14. Mai 2021
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#1

LoadLibrary vs GetModuleHandle, eine Verständisfrage

  Alt 14. Mai 2021, 20:22
Hallo, hier mal ein stück code mit einem Ergebnis was mich etwas verwirrt.

gegeben ist dieser Auszug aus meinem Theming Projekt (der Vollständigkeit halber ist hoffentlich alles nötige mit aufgeführt)

In dieser Variante, funktioniert (auch wenn falsch integriert) bei gesetzten ThemeDarkLight es halbwegs so wie ich es erhoffe.
Delphi-Quellcode:
type
  TkzTheme = (ThemeNone, ThemeDarkLight, ThemeSystem, ThemeWallpaper);

  kzTheme = class(TObject)
    ...
  strict private
    FStyleTheme: TkzTheme;
  strict private
    procedure SetDwmMode(const AMode: ShortInt);
    ...
  end;

  AccentPolicy = packed record
    AccentState: Integer;
    AccentFlags: Integer;
    GradientColor: Integer;
    AnimationId: Integer;
  end;

  TWinCompAttrData = packed record
    attribute: THandle;
    pData: Pointer;
    dataSize: ULONG;
  end;

var
  SetWindowCompositionAttribute: function(Wnd: HWND; const AttrData: TWinCompAttrData): BOOL; stdcall = nil;

implementation

procedure kzTheme.SetDwmMode(const AMode: ShortInt);
const
  WCA_ACCENT_POLICY = 19;
  ACCENT_DISABLE = 0;
  ACCENT_ENABLE_GRADIENT = 1;
  ACCENT_ENABLE_TRANSPARENT = 2;
  ACCENT_ENABLE_BLURBEHIND = 3;
  GRADIENT_COLOR = $01000000;
  DrawLeftBorder = $20;
  DrawTopBorder = $40;
  DrawRightBorder = $80;
  DrawBottomBorder = $100;
var
  dwm10: THandle;
  data: TWinCompAttrData;
  accent: AccentPolicy;
begin
  if (not ((AMode = ACCENT_DISABLE) or (AMode = ACCENT_ENABLE_TRANSPARENT) or (AMode = ACCENT_ENABLE_BLURBEHIND))) then
    Exit;
  dwm10 := LoadLibrary(user32);
  try
    @SetWindowCompositionAttribute := GetProcAddress(dwm10, 'SetWindowCompositionAttribute');
    if @SetWindowCompositionAttribute <> nil then
    begin
      accent.AccentState := AMode;
      accent.AccentFlags := DrawLeftBorder or DrawTopBorder or DrawRightBorder or DrawBottomBorder;
      if ((FStyleTheme = ThemeSystem) or (FStyleTheme = ThemeWallpaper)) then
        accent.GradientColor := FColorBackground;
      data.attribute := WCA_ACCENT_POLICY;
      data.dataSize := SizeOf(accent);
      data.pData := @accent;
      SetWindowCompositionAttribute(FForm.Handle, data);
    end;
  finally
    FreeLibrary(dwm10);
  end;
end;

initialization
  SetWindowCompositionAttribute := GetProcAddress(GetModuleHandle(user32), 'SetWindowCompositionAttribute');
end.
himitsu schrieb ich soll auf LoadLibrary verzichten und direkt per GetModuleHandle zugreifen sowie den Schutzblock entfernen, gesagt getan:
Delphi-Quellcode:
procedure kzTheme.SetDwmMode(const AMode: ShortInt);
const
  WCA_ACCENT_POLICY = 19;
  ACCENT_DISABLE = 0;
  ACCENT_ENABLE_GRADIENT = 1;
  ACCENT_ENABLE_TRANSPARENT = 2;
  ACCENT_ENABLE_BLURBEHIND = 3;
  GRADIENT_COLOR = $01000000;
  DrawLeftBorder = $20;
  DrawTopBorder = $40;
  DrawRightBorder = $80;
  DrawBottomBorder = $100;
var
  data: TWinCompAttrData;
  accent: AccentPolicy;
begin
  if (not ((AMode = ACCENT_DISABLE) or (AMode = ACCENT_ENABLE_TRANSPARENT) or (AMode = ACCENT_ENABLE_BLURBEHIND))) then
    Exit;
  @SetWindowCompositionAttribute := GetProcAddress(GetModuleHandle(user32), 'SetWindowCompositionAttribute');
  if @SetWindowCompositionAttribute <> nil then
  begin
    accent.AccentState := AMode;
    accent.AccentFlags := DrawLeftBorder or DrawTopBorder or DrawRightBorder or DrawBottomBorder;
    if ((FStyleTheme = ThemeSystem) or (FStyleTheme = ThemeWallpaper)) then
      accent.GradientColor := FColorBackground;
    data.attribute := WCA_ACCENT_POLICY;
    data.dataSize := SizeOf(accent);
    data.pData := @accent;
    SetWindowCompositionAttribute(FForm.Handle, data);
  end;
end;
Doch nun funktioniert wenn ThemeDarkLight aktiv ist (Hintergrund ist schwarz) es nicht mehr.

Liegt es daran das mein code generell falsch ist oder gibt es doch unterschiede zwischen LoadLibrary und GetModuleHandle die mir momentan noch verborgen sind?

LG
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
728 Beiträge
 
Delphi 2010 Architect
 
#2

AW: LoadLibrary vs GetModuleHandle, eine Verständisfrage

  Alt 14. Mai 2021, 20:56
Hmmm..

Delphi-Quellcode:
var
  hUser: HModule;
begin
  hUser := GetModuleHandle('user32.dll');
  @SetWindowCompositionAttribute := GetProcAddress(hUser, 'SetWindowCompositionAttribute');
end;
was sagt hUser ?

GetModuleHandle(user32) <> GetModuleHandle('user32.dll');

Geändert von venice2 (14. Mai 2021 um 21:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: LoadLibrary vs GetModuleHandle, eine Verständisfrage

  Alt 14. Mai 2021, 21:37
Danke Emil für Deine Vorschläge!

Ich habe mir alle Varianten mal in einer Box darstellen lassen, alle lieferten die gleiche Nummer.
Der Fehler, bzw das was irgendwie anders arbeitet ist hier verborgen:
Delphi-Quellcode:
    ...
    @SetWindowCompositionAttribute := GetProcAddress(GetModuleHandle(user32), 'SetWindowCompositionAttribute'); // <- so ruf ich es nun auf
    ...
    if ((FStyleTheme = ThemeSystem) or (FStyleTheme = ThemeWallpaper)) then
      accent.GradientColor := FColorBackground
      else
      accent.GradientColor := FColorText; // das hier musste gesetzt werden damit der hintergrund wieder transparent wird...
so funktioniert es momentan, auch wenn nur dürftig (habe immer noch dein video im hinterstübchen^^)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
728 Beiträge
 
Delphi 2010 Architect
 
#4

AW: LoadLibrary vs GetModuleHandle, eine Verständisfrage

  Alt 14. Mai 2021, 21:54
Warum du dich weigerst einen String zu übergeben ist mir schleierhaft.
Siehe getmodulehandlea

Code:
HMODULE GetModuleHandleA(
  LPCSTR lpModuleName
);
Es sei denn du hast user32 als const definiert. (vielleicht in irgendeiner Unit in Delphi selbst)
Kann ich jetzt nicht sehen.

Wie dem auch sei.

Geändert von venice2 (14. Mai 2021 um 22:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: LoadLibrary vs GetModuleHandle, eine Verständisfrage

  Alt 14. Mai 2021, 22:06
Warum du dich weigerst einen String zu übergeben ist mir schleierhaft.
Es sei denn du hast user32 als const definiert.
Ich weigere mich nicht ein bisschen, wirklich nicht!
Habe es ja mit beide Variationen getestet, als user32 und auch als 'user32.dll' , gleiches Resultat erhalten.
Die uses Winapi.Windows datei hat es als const definiert  user32 = 'user32.dll'; .
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
728 Beiträge
 
Delphi 2010 Architect
 
#6

AW: LoadLibrary vs GetModuleHandle, eine Verständisfrage

  Alt 14. Mai 2021, 22:11
Zitat:
uses Winapi.Windows datei hat es als const definiert.
Ok das erklärt alles. Sorry

Geändert von venice2 (14. Mai 2021 um 22:20 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 04:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf