AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Programme im Kompatibilitätsmodus ausführen!
Thema durchsuchen
Ansicht
Themen-Optionen

Programme im Kompatibilitätsmodus ausführen!

Ein Thema von Bomberbb · begonnen am 13. Nov 2008 · letzter Beitrag vom 14. Nov 2008
Antwort Antwort
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#1

Programme im Kompatibilitätsmodus ausführen!

  Alt 13. Nov 2008, 12:25
Hallo,

gibt es eine Möglichkeit fremde Programme von Delphi aus im Kompatibilitätsmodus zu starten?
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Programme im Kompatibilitätsmodus ausführen!

  Alt 13. Nov 2008, 12:56
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.
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Programme im Kompatibilitätsmodus ausführen!

  Alt 13. Nov 2008, 13:10
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.
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#4

Re: Programme im Kompatibilitätsmodus ausführen!

  Alt 13. Nov 2008, 13:54
Besten Dank, werd ich mal ausprobieren!
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#5

Re: Programme im Kompatibilitätsmodus ausführen!

  Alt 13. Nov 2008, 14:46
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!!!
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Programme im Kompatibilitätsmodus ausführen!

  Alt 13. Nov 2008, 17:46
Du solltest __COMPAT_LAYER danach dann aber auch wieder zurück setzen, ansonsten werden alle Anwendungen mit dem Kompatibilitätslayer gestartet.
Fridolin Walther
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#7

Re: Programme im Kompatibilitätsmodus ausführen!

  Alt 14. Nov 2008, 08:43
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.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Programme im Kompatibilitätsmodus ausführen!

  Alt 14. Nov 2008, 11:06
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.
Fridolin Walther
  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 14:19 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