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 Programme im Kompatibilitätsmodus ausführen! (https://www.delphipraxis.net/124033-programme-im-kompatibilitaetsmodus-ausfuehren.html)

Bomberbb 13. Nov 2008 11:25


Programme im Kompatibilitätsmodus ausführen!
 
Hallo,

gibt es eine Möglichkeit fremde Programme von Delphi aus im Kompatibilitätsmodus zu starten?

Fridolin Walther 13. Nov 2008 11:56

Re: Programme im Kompatibilitätsmodus ausführen!
 
Der einzige mir bekannte Weg ist die gewünschten Settings in HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers bzw. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers zu setzen und die Applikation dann zu starten.

nicodex 13. Nov 2008 12:10

Re: Programme im Kompatibilitätsmodus ausführen!
 
Setze vorher die Umgebungsvariable __COMPAT_LAYER.
Siehe http://www.microsoft.com/windowsxp/u.../layertip.mspx

Mit Hilfe von __COMPAT_LAYER kann man auch feststellen, ob das eigene Programm mit AppCompat-Layern ausgeführt wird.

Zum Lesen und Setzen der permantenten AppCompat-Layer (Dateieigenschaften) gibt es (meines Wissens nur) undokumentierte Funktionen (welche momentan die o.g. Registrywerte lesen/setzen):
Delphi-Quellcode:
interface

uses
  Windows;

const
  APPHELP_PERMLAYERS_LOCAL = $00000001;
  APPHELP_PERMLAYERS_GLOBAL = $00000002;
  APPHELP_PERMLAYERS_ALL =
    APPHELP_PERMLAYERS_LOCAL or
    APPHELP_PERMLAYERS_GLOBAL;

type
  TFNGetPermLayers = function(wszPath: LPCWSTR; wszBuffer: LPWSTR; var pdwBytes: ULONG; dwFlags: ULONG): BOOL; stdcall;

function GetPermLayers(wszPath: LPCWSTR; wszBuffer: LPWSTR; var pdwBytes: ULONG; dwFlags: ULONG): BOOL; stdcall;

type
  TFNSetPermLayers = function(wszPath, wszLayers: LPCWSTR; bGlobal: BOOL): BOOL; stdcall;

function SetPermLayers(wszPath, wszLayers: LPCWSTR; bGlobal: BOOL): BOOL; stdcall;

const
  AppHelpLib = 'apphelp.dll';

implementation

function GetPermLayers; external AppHelpLib;
function SetPermLayers; external AppHelpLib;

end.

Bomberbb 13. Nov 2008 12:54

Re: Programme im Kompatibilitätsmodus ausführen!
 
Besten Dank, werd ich mal ausprobieren!

Bomberbb 13. Nov 2008 13:46

Re: Programme im Kompatibilitätsmodus ausführen!
 
nun hab ich's:

SetEnvironmentVariable('__COMPAT_LAYER', 'DisableThemes DisableDWM');
CreateProcess(Nil,PChar('test.exe'),Nil,Nil,False, CREATE_NO_WINDOW,Nil,Nil,si,pi);

DANKE!!!

Fridolin Walther 13. Nov 2008 16:46

Re: Programme im Kompatibilitätsmodus ausführen!
 
Du solltest __COMPAT_LAYER danach dann aber auch wieder zurück setzen, ansonsten werden alle Anwendungen mit dem Kompatibilitätslayer gestartet.

Bomberbb 14. Nov 2008 07:43

Re: Programme im Kompatibilitätsmodus ausführen!
 
Ich hatte irgendwo gelesen, dass __COMPAT_LAYER Anwendungslokal ist. Habe es nicht zurückgesetzt, da das Prog nur aus den 3 Zeilen besteht. In anderen Anwendungen ist es natürlich sinnvoll die Variable auch wieder zurückzusetzen.

Fridolin Walther 14. Nov 2008 10:06

Re: Programme im Kompatibilitätsmodus ausführen!
 
Zitat:

Zitat von Bomberbb
Ich hatte irgendwo gelesen, dass __COMPAT_LAYER Anwendungslokal ist. Habe es nicht zurückgesetzt, da das Prog nur aus den 3 Zeilen besteht. In anderen Anwendungen ist es natürlich sinnvoll die Variable auch wieder zurückzusetzen.

Ja, es ist schon lokal. Aber wenn Deine Anwendung eine Applikation startet, ist es naheliegend das sie noch weitere startet. Deshalb der Hinweis, das alle anderen Applikationen dann auch im Kompatibilitätsmodus ausgeführt werden. Wenn sie das nicht tut und nur aus 3 Zeilen besteht, ists natürlich eher egal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 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