![]() |
TRegistry: Unterschied zwischen Konsole und GUI?
Hallöle,
gegeben sei folgende Funktion:
Delphi-Quellcode:
In einem GUI-Programm bekomme ich true und damit einen Wert zurück, in einer Konsolenanwendung nicht (natürlich bei exakt identischem Code). Hat jemand eine Ahnung, woran das liegen könnte?
function GetTheUltimateAnswer(out Value: string): Boolean;
const Key = 'SOFTWARE\Deep Thought'; Ident = 'Die Frage nach dem Leben, dem Universum und einfach allem'; var Reg: TRegistry; begin Value := ''; Result := false; Reg := TRegistry.Create(KEY_READ); try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey(Key, false) then try Value := Reg.ReadString(Ident); Result := Value <> ''; finally Reg.CloseKey; end; finally Reg.Free; end; end; Nachtrag: mit einem anderen Schlüssel funktioniert das auch in der Konsole, hä? :gruebel: |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
42
Rechte? |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Leserechte sind vorhanden, außerdem ist das ja derselbe User, oder wird ein Konsolenprogramm in einem anderen Kontext ausgeführt? Achja, OpenKey wird noch ausgeführt, nur beim ReadString kommt nix zurück.
|
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Eventuell bekommt die Konsole andere Rechte, bzw. die (eventuell aktivierte) Virtualisierung greift bei Konsolen anders ein?
Bei Dateioperationen weiß ich z.B. daß dort die OEM-Codepage verwendet wird, wärend GUI-Anwendungen auf ANSI laufen. (drum sieht WriteLn('ä') etwas komisch aus, bzw FindFirst mit solchen Umlauten wirkt auch nicht unbedingt so, wie gewollt) ![]() ![]() ![]() Vielleicht gibt's sowas auch für die Registry, bzw. es wirkt sich auch auf Diese aus. [add] ![]() |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Hmm..., der originale Ident enthält einen Tiefstrich, ob es daran liegt? Aber ist der denn unterschiedlich zwischen Ansi und OEM, zumindest ist mir das nie aufgefallen.
|
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Reg := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY );
geht bei mir im nicht Wow6432Node |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Nochmal: derselbe Code mit demselben Delphi auf demselben System (Vista 32 Business) liefert entweder ein Ergebnis(GUI) oder nicht(Konsole). Wahrscheinlich hat das tatsächlich mit der Zeichenkodierung zu tun, aber bevor ich jetzt mit OEMToCharBuff o.ä. herumhantiere habe ich nun doch ein "normales" VCL-Progrämmchen daraus gemacht. Interessant ist der Effekt trotzdem.
|
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Du kannst auch das {$APP CONSOLE} aus der Konsolenanwendung entfernen, dann ist es quasi eine GUI-Anwendung, ohne GUI.
Funktioniert es dann? (Notfalls kann man sich dann über CreateConsole AllocConsole ein Konsolenfenster in seine GUI-Anwendung holen) |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Tut auch nicht, nur als Standard-VCL-Programm. Komisch, das. Ich probier das jetzt mal mit Umkodieren, weil es mich interessiert.
[edit] Jetzt wird es ganz ulkig: KeyExists liefert auch unter VCL false, ausgelesen wird trotzdem der richtige Wert :shock: [/edit] [edit2] Logisch, das müsste ja auch ValueExists heißen :oops: [/edit2] |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Und auch hier wieder mal der Hinweis auf den
![]() Damit debugge ich so etwas immer schnell und brauche nicht lange suchen. |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Zitat:
solange Du Dich auf 0-9, A-Z und a-z beschränkst ist OEM mit ANSI gleich. Erst bei den Umlauten und den Sonderzeichen wird es interessant. "_" ist auf jeden Fall in beiden Fällen das gleiche. Gruß K-H |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Zitat:
|
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Zitat:
|
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Funktioniert, ob Konsole oder GUI:
Delphi-Quellcode:
OK, anderer RootKey, aber daran wird es wohl kaum liegen.
procedure TestKey;
const KeyName = '\Software\Test\Test'; var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey(KeyName, true) then try Reg.WriteString('A_B', 'Ohne GUI');//oder eben "Mit GUI" finally Reg.CloseKey; end; finally Reg.Free; end; end; |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Ganz oben stand schon ein Hinweis... wie sieht's denn mit Manifesten (re Virtualisierungsstatus) und Elevation aus?
|
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Außer dem Standard-Manifest, das Delphi sowieso einbindet, ist nichts weiter vorhanden. Aber wie bereits erwähnt ist das Problem nur noch ein akademisches, da ich nun doch eine VCL-Anwendung daraus gemacht habe.
|
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Wie schon geschrieben:
Wenn du es noch schnell und einfach herausfinden möchtest woran es denn nun lag, brauchst du nur den Process Monitor zu starten und den Filter auf "Processname is DeineExe.exe" zu setzen. Da so viele Registryzugriffe an der Stelle ja nicht passieren, findet man die Stelle im Log auch leicht. |
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Wobei die VCL auch so manche Dinge initialisiert, vorallem irgendwelches OLE-Zeugs und sonstewas.
|
AW: TRegistry: Unterschied zwischen Konsole und GUI?
Ich hab mir mal ein paar Fonts in Ansi/OEM angeschaut, Zum einen haben verschiedene Fonts den Unterstrich (bzw. etwas das so aussieht) mehrfach vorhanden, zum anderen varieren die Positionen auch noch. Zuverlässig ist da nur x5F.
Ein Hoch auf dieses codepage Wirrwar und das was man sieht. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:28 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-2025 by Thomas Breitkreuz