Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi XP-Style in DLL (https://www.delphipraxis.net/59767-xp-style-dll.html)

c113plpbr 28. Dez 2005 14:48


XP-Style in DLL
 
Hallo DP'ler,

mein Problem ist folgendes:
Ein fremdes Programm lädt meine DLL, welche dann eine VCL-Form anzeigt. Das Problem dabei ist, dass dieses fremde Programm kein XP-Style-Manifest enthält, und somit meine Form auch ohne XP-Style angezeigt wird. Dies ist aber nicht in meinem Sinne, und daher suche ich nach einer Möglichkeit dies zu ändern, zumindest für meine Form. Da ein XP-Style-Manifest in meiner DLL relativ sinnlos ist, und InitCommonControls(Ex) den Trick auch nicht fertigbringt, bin ich nun relativ am Ende mit meinem Latein ...

Ich hoffe, ihr könnt mir helfen,
ciao & thx, Philipp

c113plpbr 29. Dez 2005 18:06

Re: XP-Style in DLL
 
Na hat keiner ne Idee? *push*

md_mse 29. Dez 2005 20:58

Re: XP-Style in DLL
 
Da die DLL ja im Kontext des Programms läuft, das keine XP-Themes unterstützt, bekommst du auch keine XP Styles in deine DLL. Jedoch kannst du ja eine *.manifest Datei erstellen, die den Namen der Hostanwendung trägt, und schon sollte es gehen.
(Der Inhalt einer solche Datei sollte ja bekannt sein :gruebel: )

faux 29. Dez 2005 21:05

Re: XP-Style in DLL
 
Was hat das XP-Style mit einer DLL zu tun?
Eine DLL ist im Prinzip nur eine externe Funktionssammlung, und wenn du da nicht eine Funktion aufrusfst, die das Style deines Programmes ändert, sollte es das keine Probleme geben. :?

Grüße
Faux

md_mse 29. Dez 2005 21:10

Re: XP-Style in DLL
 
Zitat:

Zitat von faux
Was hat das XP-Style mit einer DLL zu tun?
Eine DLL ist im Prinzip nur eine externe Funktionssammlung, und wenn du da nicht eine Funktion aufrusfst, die das Style deines Programmes ändert, sollte es das keine Probleme geben. :?

Grüße
Faux

Eine DLL ist nicht unbedingt nur eine Funktionssammlung. DLL's sind im Grunde genommen ja auch nur modifizierte EXE Files.
Und in meine DLL's kann ich ja auch VCL Forms klatschen, ich weiss nicht wie es bei dir ist :wink: .

faux 29. Dez 2005 21:13

Re: XP-Style in DLL
 
Zitat:

Zitat von md_mse
Eine DLL ist nicht unbedingt nur eine Funktionssammlung. DLL's sind im Grunde genommen ja auch nur modifizierte EXE Files.
Und in meine DLL's kann ich ja auch VCL Forms klatschen, ich weiss nicht wie es bei dir ist :wink: .

Trotzdem musst du diese extra aufrufen. Alleiniges referenzieren reicht hier nicht.
Außerdem musst du trotzdem alles in Funktionen packen, wenn du eine Form in eine DLL geben willst. Klassen kannst du da IMHO nicht verwenden.

Grüße
Faux

c113plpbr 29. Dez 2005 21:55

Re: XP-Style in DLL
 
Zitat:

Zitat von faux
Zitat:

Zitat von md_mse
Eine DLL ist nicht unbedingt nur eine Funktionssammlung. DLL's sind im Grunde genommen ja auch nur modifizierte EXE Files.
Und in meine DLL's kann ich ja auch VCL Forms klatschen, ich weiss nicht wie es bei dir ist :wink: .

Trotzdem musst du diese extra aufrufen. Alleiniges referenzieren reicht hier nicht.
Außerdem musst du trotzdem alles in Funktionen packen, wenn du eine Form in eine DLL geben willst. Klassen kannst du da IMHO nicht verwenden.

Ääähm ... funktioniert folgendermaßen:
Programm lädt DLL -> Programm ruft Funktion aus der Dll auf -> DLL zeigt VCL-Form an -> ... VCL Form hat *kein* XP-Style ... -> Problem

Das mit dem Manifest wäre soweit kein problem, doch leider ist das "fremde" Programm dass meine dll lädt rundll32.exe, und dieses liegt bekanntlicherweise im system-verzeichnis, auf welches leider nicht jeder zugriffsrechte hat. Und mein Programm sollte möglichst nicht nur mit Admin-Rechten laufen ...
Aber es wird doch wohl ne andere möglichkeit geben, oder? Hoffe ich zumindest ... ideen?

ciao, Philipp

md_mse 29. Dez 2005 22:19

Re: XP-Style in DLL
 
Zitat:

Zitat von faux
Zitat:

Zitat von md_mse
Eine DLL ist nicht unbedingt nur eine Funktionssammlung. DLL's sind im Grunde genommen ja auch nur modifizierte EXE Files.
Und in meine DLL's kann ich ja auch VCL Forms klatschen, ich weiss nicht wie es bei dir ist :wink: .

Trotzdem musst du diese extra aufrufen. Alleiniges referenzieren reicht hier nicht.
Außerdem musst du trotzdem alles in Funktionen packen, wenn du eine Form in eine DLL geben willst. Klassen kannst du da IMHO nicht verwenden.

Grüße
Faux

Das beste Beispiel für Objekte in DLL's sind gut programmierte Plugins (und natürlich ein Pluginsystem).
DLL instantiizert Objekt das ein Interface implementiert. Anwendung die das Objekt benutzen möchte, verwendet das Interface direkt (überschreibt die Referenz natürlich mit der aus der DLL). So funktionniert übrigens auch DirectX: dem Porgrammierer stehen nur Interfaces zur Verfügung die von den DX DLL's implementiert und instatiiert werden.

@c113plpbr: Hm, da weiss ich leider auch nicht mehr weiter...

faux 29. Dez 2005 22:37

Re: XP-Style in DLL
 
@md_mse:
Schon klar, aber ich wollte ja nur sagen, dass du in DLLs nur Funktionen unterbringenkannst. Du hast dann gesagt, dass man auch Forms reinpacken kann, und ich dann wiederum, dass auch diese in Funktionen sind. ;)

Ist die DLL von dir, also hast du den Code?
md_mse hat bereits vorgeschlagen, dass du mal mit manifest probieren kannst. ;)

md_mse 29. Dez 2005 22:46

Re: XP-Style in DLL
 
@faux: Ja gut, sind das Programme nicht auch? :thumb:
@c113plpbr: Hast du eigentlich mal versucht diese manifest XML in die Ressourcen hinzuzufügen?

c113plpbr 29. Dez 2005 22:51

Re: XP-Style in DLL
 
Zitat:

Zitat von faux
Ist die DLL von dir, also hast du den Code?

Ja, es ist meine DLL
Zitat:

Zitat von faux
md_mse hat bereits vorgeschlagen, dass du mal mit manifest probieren kannst. ;)

Und ich hab bereits gesagt, warum dies nur schwer möglich ist:
Zitat:

Zitat von c113plpbr
Das mit dem Manifest wäre soweit kein problem, doch leider ist das "fremde" Programm dass meine dll lädt rundll32.exe, und dieses liegt bekanntlicherweise im system-verzeichnis, auf welches leider nicht jeder zugriffsrechte hat. Und mein Programm sollte möglichst nicht nur mit Admin-Rechten laufen ...

Zitat:

Zitat von md_mse
Hast du eigentlich mal versucht diese manifest XML in die Ressourcen hinzuzufügen?

Ja, ich habs in die dll-ressoucen hinzugefügt, leider ohne Erfolg.


ciao, Philipp

faux 29. Dez 2005 22:57

Re: XP-Style in DLL
 
Zitat:

Zitat von c113plpbr
Zitat:

Zitat von faux
Ist die DLL von dir, also hast du den Code?

Ja, es ist meine DLL

Hast du schon probiert XPMan in die uses-Klausel aufzunehmen?

Ich hab mal Gegooglet und das hier gefunden: http://www.link-rank.com/dll.htm. Hier wird erklärt wie man eine Form in eine DLL einbindet, was du jedoch schon hast. Auf dem Screenshot jedoch, siehts so aus, also ob er das XP-Style auch in der DLL-Form hat. Sieh dir mal an wie der das erledigt hat. ;)

Grüße
Faux

c113plpbr 29. Dez 2005 23:16

Re: XP-Style in DLL
 
Zitat:

Zitat von faux
Hast du schon probiert XPMan in die uses-Klausel aufzunehmen?

Genauer lesen bitte:
Zitat:

Zitat von c113plpbr
Zitat:

Zitat von md_mse
Hast du eigentlich mal versucht diese manifest XML in die Ressourcen hinzuzufügen?

Ja, ich habs in die dll-ressoucen hinzugefügt, leider ohne Erfolg.

Das ist so ziemlich dasselbe ...

Zitat:

Zitat von faux
Ich hab mal Gegooglet und das hier gefunden: http://www.link-rank.com/dll.htm. Hier wird erklärt wie man eine Form in eine DLL einbindet, was du jedoch schon hast. Auf dem Screenshot jedoch, siehts so aus, also ob er das XP-Style auch in der DLL-Form hat. Sieh dir mal an wie der das erledigt hat. ;)

Da muss man nicht viel weiter lesen als bis dahin:
Zitat:

This is VCLSkin demo for DLL form.
Das ist eine kostenpflichtige Style-komponente ...

ciao, Philipp

faux 29. Dez 2005 23:24

Re: XP-Style in DLL
 
Zitat:

Zitat von c113plpbr
a muss man nicht viel weiter lesen als bis dahin

Ich habs nicht gelesen.

Und was ist mit der Manifest?

c113plpbr 29. Dez 2005 23:45

Re: XP-Style in DLL
 
Zitat:

Zitat von faux
Und was ist mit der Manifest?

Wie? Du meinst als ".manifest" datei, oder? Wenn ja, solltest du wirklich besser lesen:
Zitat:

Zitat von c113plpbr
Das mit dem Manifest wäre soweit kein problem, doch leider ist das "fremde" Programm dass meine dll lädt rundll32.exe, und dieses liegt bekanntlicherweise im system-verzeichnis, auf welches leider nicht jeder zugriffsrechte hat. Und mein Programm sollte möglichst nicht nur mit Admin-Rechten laufen ...

Sprich, das is ned so doll ... da ich eigentlich nicht vorhabe rundll32.exe mit nem xp-manifest auszustatten ...

Aber es muss doch da irgendeine "Software-Lösung" geben, irgendeinen API-Befehl, oder was auch immer ...

ciao, Philipp

md_mse 30. Dez 2005 00:12

Re: XP-Style in DLL
 
Hab da vielleicht was gefunden...
Guck dir mal die UxTheme.pas an, die bei Delphi mit dabei sein sollte... Zumindest ab 2005 (?).
An sonsten findest du sie auf Delphi-Gems
Da gibt es interessante Methoden, vielleicht bringts ja was.

c113plpbr 30. Dez 2005 14:21

Re: XP-Style in DLL
 
Zitat:

Zitat von md_mse
Hab da vielleicht was gefunden...
Guck dir mal die UxTheme.pas an, die bei Delphi mit dabei sein sollte... Zumindest ab 2005 (?).
An sonsten findest du sie auf Delphi-Gems
Da gibt es interessante Methoden, vielleicht bringts ja was.

Hmm ... ja, die unit enthält ganz interessante sachen ... so kommt es, dass ich jetzt mithilfe der Funktion "SetWindowTheme" XP-Styles entfernen oder verdrehen kann ... sieht ganz lustig aus, wenn man einer Form den style eines Buttons gibt, aber dennoch kann ich komponenten die kein XP-Style haben, nicht damit ausstatten ... warum auch immer, denn bei
Delphi-Quellcode:
SetWindowTheme(btn.Handle, nil, 'button');
passiert garnix ... ich hab schon ziemlich viel rumprobiert, aber ich werd daraus einfach ned schlau ... kennt sich damit jemand aus?

ciao, Philipp

md_mse 31. Dez 2005 01:24

Re: XP-Style in DLL
 
Vergiss aber nicht, das das XML File in den Ressourcen sein muss!

Flocke 31. Dez 2005 13:18

Re: XP-Style in DLL
 
Ich hab' gerade mal ein bisschen nachgeforscht und versucht, UxTheme.IsAppThemed und UxTheme.IsThemeActive zu überschreiben. Das Problem ist, dass der Aufruf (Themes.pas):
Delphi-Quellcode:
FNewComCtrls := GetFileVersion(comctl32) >= ComCtlVersionIE6;
je nach vorhandenem Manifest eine andere Version zurückliefert (ohne: 5.irgendwas, mit: 6.irgendwas) und danach entschieden wird, ob theming benutzt werden kann.

Auf meinem Rechner (MCE 2005):
C:\Windows\system32\comctl32.dll: 5.82.2900.2649
C:\Windows\WinSxS\x86_Microsoft.Windows.Common-Controls_...\comctl32.dll: 6.0.2600.0, 6.0.2900.2180 und 6.0.2900.2649

Ich hab' noch keine Möglichkeit gefunden das zu umgehen...

xaromz 31. Dez 2005 13:32

Re: XP-Style in DLL
 
Hallo,
Zitat:

Zitat von Flocke
Das Problem ist, dass der Aufruf (Themes.pas):
Delphi-Quellcode:
FNewComCtrls := GetFileVersion(comctl32) >= ComCtlVersionIE6;
je nach vorhandenem Manifest eine andere Version zurückliefert (ohne: 5.irgendwas, mit: 6.irgendwas) und danach entschieden wird, ob theming benutzt werden kann.

Das ist nicht das Problem, sondern genau der Grund für das Manifest. Dieses entscheidet, welche Version verwendet wird. Nur mit der Version >= 6 ist Theming möglich.

Gruß
xaromz

Flocke 31. Dez 2005 15:06

Re: XP-Style in DLL
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von Flocke
Das Problem ist, dass der Aufruf (Themes.pas):
Delphi-Quellcode:
FNewComCtrls := GetFileVersion(comctl32) >= ComCtlVersionIE6;
je nach vorhandenem Manifest eine andere Version zurückliefert (ohne: 5.irgendwas, mit: 6.irgendwas) und danach entschieden wird, ob theming benutzt werden kann.

Das ist nicht das Problem, sondern genau der Grund für das Manifest. Dieses entscheidet, welche Version verwendet wird. Nur mit der Version >= 6 ist Theming möglich.

Gruß
xaromz

In diesem Fall ist es doch das Problem, da wir ja Themes *OHNE* Manifest für die Exe benutzen wollen.

xaromz 31. Dez 2005 15:18

Re: XP-Style in DLL
 
Hallo,
Zitat:

Zitat von Flocke
In diesem Fall ist es doch das Problem, da wir ja Themes *OHNE* Manifest für die Exe benutzen wollen.

das ist kein Problem, das ist unmöglich. Ohne Manifest wird die Version 6 nicht geladen, außerdem vermute ich, dass das Hauptprogramm entscheidet, welche Version geladen wird und nicht die DLL. Deshalb kann man vielleicht in einer DLL Themes ausschalten, aber vermutlich nicht einschalten. Wenn es aber jemand schafft, in der DLL die Version 6 nachzuladen... (aber das wäre dann beeindruckend).

Gruß
xaromz

c113plpbr 31. Dez 2005 16:50

Re: XP-Style in DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
... *lach* :lol: :mrgreen: ...

oh man ... lang hats gedauert, aber ihr habt mich auf ne idee gebracht ... und ich hab mich mal ein wenig besser über manifeste informiert ... zumindest hab ichs versucht, bis ich dann auf diese seite gestoßen bin:
http://msdn2.microsoft.com/en-us/lib...US,VS.80).aspx

klang ganz interessant, habs mir durchgelesen, und fast diesen einen kleinen zusatz überlesen:
Zitat:

Note that the manifest ID is 1 for an EXE, 2 for a DLL.
Habs natürlich sofort ausprobiert, allerdings ohne erfolg ... doch nun dachte ich mir, es MUSS einen Weg auch für dll's geben (wenn die es da schon extra reinschreiben), also hab ich den resource hacker genommen, und mir ein paar viele m$ dlls angeschaut ... und siehe da, nicht 2, sondern 123 ist der schlüssel ...

Im Anhang hab ich euch mal das neue Resourcefile für dll's angehängt ... ^^, einfach per {$R WindowsXP_DLL.res} einbinden.

ciao und DANKE AN ALLE,
Philipp


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz