![]() |
Seltsames Phänomen bei CMDs
Ich habe ein Programm was CMDs ausführt und vorher Windows USER Variablen setzt.
Wenn ich jetzt die CMD doppelklicke geht alles, über CMD Shell auch nur über mein Programm werden die Variablen nicht gefunden (alle Leer). Hier der Code zum ausführen.
Delphi-Quellcode:
Was mache ich da Falsch.
BUFFER:='CMD';
Extparams:='/C test,cmd'; ShellExecute(0,'open',PChar(Buffer), PChar(Extparams),Nil,SW_SHOW); |
AW: Seltsames Phänomen bei CMDs
Wann genau bzw. wo werden die Variablen gesetzt? Im Delphi-Programm, in der CMD oder woanders?
MfG Dalai |
AW: Seltsames Phänomen bei CMDs
Delphi-Quellcode:
So setze ich die Variablen.
procedure TXMLParser1.SetENV(const ENVName, ENVVar: String);
Var Reg : TRegistry; aResult : Cardinal; {Error Number returned from API Call} begin //SetEnvironmentVariable(PwideChar(ENVName),PwideChar(ENVVar)); //Exit; Reg:=TRegistry.Create; Reg.RootKey:=HKEY_CURRENT_USER; Reg.OpenKey('Environment',False); Reg.WriteString(ENVName,ENVVar); Reg.CloseKey; FreeAndNil(Reg); SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LParam (PChar('Environment')), SMTO_ABORTIFHUNG, 5000, aResult); {Display windows lasterror if the result is an error.} if aResult <> 0 then begin SysErrorMessage(aResult); end; end; Das geht auch wenn ich ein CMD öffne und SET eingeben sind die Variabeln da. |
AW: Seltsames Phänomen bei CMDs
Nun, SysErrorMessage macht was genau? Einen String zurückgeben. Den zeigst du aber nicht an, daher weißt du gar nicht, ob da ein Fehler aufgetreten ist.
Davon abgesehen glaube ich nicht, dass das Setzen von Umgebungsvariablen so gedacht ist und dein Programm würde sofort von meiner Platte fliegen, wenn es irgendwo in der Registry rumschreibt bei sowas flüchtigem wie Umgebungsvariablen. Warum nimmst du nicht SetEnvironmentVariable, was du schon stehen, aber auskommentiert hast? Die damit gesetzten Umgebungsvariablen müssten für den aktuellen Prozess und dessen Kinder gültig sein (und wenn nicht, gibt's ja noch das WM_SETTINGCHANGE). MfG Dalai |
AW: Seltsames Phänomen bei CMDs
Zitat:
|
AW: Seltsames Phänomen bei CMDs
|
AW: Seltsames Phänomen bei CMDs
Zitat:
Es sollte doch wohl '/C test.cmd' sein: Die Batchdatei test.cmd soll ausgeführt werden. Schreib doch mal ein pause in test.cmd und kontrolliere ob die Ausführung überhaupt stattfindet. Im übrigen sind Änderungen an Umgebungsvariablen, die in test.cmd vorgenommen werden, in der Regel nur im lokalen Environment wirksam und nach Beendigung der Batchdatei nicht im Parentenvironment vorhanden. |
AW: Seltsames Phänomen bei CMDs
Zitat:
Delphi-Quellcode:
Das heißt, die Variable blub enthält den Wert mist. Und ob da nun die cmd.exe oder ein Batchskript gestartet wird, spielt keine Rolle. Denn auch das hier funktioniert:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses ShellApi; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin SetEnvironmentVariable('blub', 'mist'); ShellExecute(Self.Handle, 'open', 'cmd.exe', nil, nil, SW_SHOW); end;
Delphi-Quellcode:
mit test.cmd:
ShellExecute(Self.Handle, 'open', 'cmd.exe', '/K C:\test.cmd', nil, SW_SHOW);
Code:
Es gibt also keine Notwendigkeit für irgendwelche Verrenkungen.
@echo off
set MfG Dalai |
AW: Seltsames Phänomen bei CMDs
SetEnvironmentVariable(PwideChar(ENVName),PwideCha r(ENVVar)); geht hatte es aber in eine Timer gesetzt was anscheinend nicht geht
|
AW: Seltsames Phänomen bei CMDs
Mal so nebenbei: Wenn dieses Programm auf Kundenrechnern läuft, sollte man auf das
![]()
Delphi-Quellcode:
Hier habe ich mir den aktuellen EnvironmentBlock ausgelesen, kopiert und noch weitere Variablen angehangen. Dieser Block wird dann an
function CreateEnvironmentBlock(lpEnvironment: Pointer; hToken: THandle;
bInherit: BOOL): BOOL; stdcall; external 'userenv.dll'; function DestroyEnvironmentBlock(lpEnvironment: Pointer): BOOL; stdcall; external 'userenv.dll'; procedure TForm5.Button1Click(Sender: TObject); var Token: THandle; EnvironmentBlock: Pointer; EnvData: WideString; CurVar: PWideChar; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin if (OpenProcessToken(GetCurrentProcess, TOKEN_ALL_ACCESS, Token)) then try if (not CreateEnvironmentBlock(@EnvironmentBlock, Token, false)) then RaiseLastOSError; try EnvData := ''; // Copy existing environment variables CurVar := EnvironmentBlock; repeat if (CurVar <> '') then begin EnvData := EnvData + CurVar + #0; CurVar := PWideChar(PByte(CurVar) + (Length(CurVar) + 1) * SizeOf(WideChar)); end; until (CurVar = ''); // Add new environment variables EnvData := EnvData + 'test=wuppdi' + #0; EnvData := EnvData + 'var2=DP' + #0; // Add termination char EnvData := EnvData + #0; // Start console with modified environment block FillChar(StartupInfo, SizeOf(StartupInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); if (not CreateProcess('C:\Windows\System32\cmd.exe', nil, nil, nil, false, CREATE_UNICODE_ENVIRONMENT, @EnvData[1], nil, StartupInfo, ProcessInfo)) then RaiseLastOSError; try // .. finally CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end; finally DestroyEnvironmentBlock(EnvironmentBlock); end; finally CloseHandle(Token); end; end; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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