Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Seltsames Phänomen bei CMDs (https://www.delphipraxis.net/184896-seltsames-phaenomen-bei-cmds.html)

franktron 28. Apr 2015 16:28

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:
BUFFER:='CMD';
Extparams:='/C test,cmd';
ShellExecute(0,'open',PChar(Buffer),
        PChar(Extparams),Nil,SW_SHOW);
Was mache ich da Falsch.

Dalai 28. Apr 2015 16:56

AW: Seltsames Phänomen bei CMDs
 
Wann genau bzw. wo werden die Variablen gesetzt? Im Delphi-Programm, in der CMD oder woanders?

MfG Dalai

franktron 28. Apr 2015 16:58

AW: Seltsames Phänomen bei CMDs
 
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.

Dalai 28. Apr 2015 17:16

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

franktron 29. Apr 2015 08:08

AW: Seltsames Phänomen bei CMDs
 
Zitat:

Zitat von Dalai (Beitrag 1299587)
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

Sir Rufo 29. Apr 2015 08:23

AW: Seltsames Phänomen bei CMDs
 
Evtl. hilft ja das hier
http://delphi.cjcsoft.net/viewthread.php?tid=43764

gammatester 29. Apr 2015 09:21

AW: Seltsames Phänomen bei CMDs
 
Zitat:

Zitat von franktron (Beitrag 1299577)
Delphi-Quellcode:
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.

Dalai 29. Apr 2015 11:26

AW: Seltsames Phänomen bei CMDs
 
Zitat:

Zitat von franktron (Beitrag 1299624)
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:
Delphi-Quellcode:
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

franktron 29. Apr 2015 11:41

AW: Seltsames Phänomen bei CMDs
 
SetEnvironmentVariable(PwideChar(ENVName),PwideCha r(ENVVar)); geht hatte es aber in eine Timer gesetzt was anscheinend nicht geht

Zacherl 29. Apr 2015 13:51

AW: Seltsames Phänomen bei CMDs
 
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 :P). 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:55 Uhr.
Seite 1 von 2  1 2      

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