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
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#1

AW: Seltsames Phänomen bei CMDs

  Alt 28. Apr 2015, 17: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
 
#2

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 08: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
 
#3

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 08: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
Benutzerbild von Dalai
Dalai

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

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 11: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 11:29 Uhr)
  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, 11: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
 
#6

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 13: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
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#7

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 13:57
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 ).
Das ist keine globale Einstellung. Es wird eine Variable für den aktuellen Prozess gesetzt, die - wie das so unter Windows üblich ist - auch an dessen Kinder weitergegeben wird. Endet dieser Prozess, ist die Variable weg. AFAIK hat das auch keinen Einfluss auf andere Prozesse, sofern sie nicht von eben jenem aus gestartet werden/wurden (siehe auch die Remarks zu SetEnvironmentVariable).

MfG Dalai

Geändert von Dalai (29. Apr 2015 um 14:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Seltsames Phänomen bei CMDs

  Alt 29. Apr 2015, 14:08
]Das ist keine globale Einstellung. Es wird eine Variable für den aktuellen Prozess gesetzt, die - wie das so unter Windows üblich ist - auch an dessen Kinder weitergegeben wird.
Du hast natürlich recht. Das hatte ich wohl falsch im Kopf.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  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 18:50 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