AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsames Phänomen bei CMDs

Ein Thema von franktron · begonnen am 28. Apr 2015 · letzter Beitrag vom 29. Apr 2015
Antwort Antwort
Seite 1 von 2  1 2      
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Seltsames Phänomen bei CMDs

  Alt 28. Apr 2015, 17:28
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:
BUFFER:='CMD';
Extparams:='/C test,cmd';
ShellExecute(0,'open',PChar(Buffer),
        PChar(Extparams),Nil,SW_SHOW);
Was mache ich da Falsch.
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#2

AW: Seltsames Phänomen bei CMDs

  Alt 28. Apr 2015, 17:56
Wann genau bzw. wo werden die Variablen gesetzt? Im Delphi-Programm, in der CMD oder woanders?

MfG Dalai
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Seltsames Phänomen bei CMDs

  Alt 28. Apr 2015, 17:58
Delphi-Quellcode:
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;
So setze ich die Variablen.

Das geht auch wenn ich ein CMD öffne und SET eingeben sind die Variabeln da.
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#4

AW: Seltsames Phänomen bei CMDs

  Alt 28. Apr 2015, 18:16
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
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 09:08
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
Will das nicht gekappt hat
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 09:23
Evtl. hilft ja das hier
http://delphi.cjcsoft.net/viewthread.php?tid=43764
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#7

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 10:21
Extparams:='/C test,cmd';
Hast Du das wirklich so?

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.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#8

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 12:26
Will das nicht gekappt hat
Geht's etwas genauer? Folgendes funktioniert einwandfrei:
Delphi-Quellcode:
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;
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: ShellExecute(Self.Handle, 'open', 'cmd.exe', '/K C:\test.cmd', nil, SW_SHOW); mit test.cmd:
Code:
@echo off
set
Es gibt also keine Notwendigkeit für irgendwelche Verrenkungen.

MfG Dalai

Geändert von Dalai (29. Apr 2015 um 12:29 Uhr)
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 12:41
SetEnvironmentVariable(PwideChar(ENVName),PwideCha r(ENVVar)); geht hatte es aber in eine Timer gesetzt was anscheinend nicht geht
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 14:51
Mal so nebenbei: Wenn dieses Programm auf Kundenrechnern läuft, sollte man auf das MSDN-Library durchsuchenSetEnvironmentVariable vielleicht komplett verzichten (ich zumindest mag es nicht, wenn mir jemand ungefragt an globalen Einstellungen rumspielt ). Es gibt noch eine andere Lösung:
Delphi-Quellcode:
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;
Hier habe ich mir den aktuellen EnvironmentBlock ausgelesen, kopiert und noch weitere Variablen angehangen. Dieser Block wird dann an MSDN-Library durchsuchenCreateProcess übergeben und gillt somit ausschließlich für die gestartete Konsoleninstanz.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:04 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