AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Thema durchsuchen
Ansicht
Themen-Optionen

Problem ShellExecute / CreateProcess + Wait mit Vista UAC

Ein Thema von Assertor · begonnen am 14. Mai 2007 · letzter Beitrag vom 9. Sep 2011
Antwort Antwort
Seite 2 von 4     12 34      
Shyran

Registriert seit: 31. Aug 2011
9 Beiträge
 
Delphi XE Professional
 
#1

AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC

  Alt 8. Sep 2011, 13:10
Hi ihr Lieben,

wie kann ich nun mit obiger Funktion eine Datei starten? Eingebunden hab ich sie noch bekommen, wenngleich ich aufgrund des Unicode's da Sorgen hatte (nutze Delphi XE) und mir nicht klar ist, welche uses ich ggf. noch nutzen muss, damit der die Funktionen "WideFileExists" z.B. findet. Ihr bemerkt schon, ich starte gerade erst mit dem ganzen Kram.

Jedenfalls führte z.B. folgende Zeile natürlich zu keinem Erfolg, ich begreife einfach den Funktionsaufruf nicht, den ich durchführen muss. Welche Parameter sind zu übergeben, damit das klappt? Ist der Deklaration werde ich leider nicht hinreichend schlau und bitte um Hilfe dazu.

Umgebaut hatte ich das nun zu:
Delphi-Quellcode:
function ExecAndWait(Filename, Params: Widestring;
                     WindowState: word = SW_SHOWNORMAL): boolean;
var
  ShExecInfoA: SHELLEXECUTEINFOA;
  r : Cardinal;
//http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecuteex.asp
//http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/shellexecuteinfo.asp
begin
  Result := false;
  if Filename = 'then exit;
  if not FileExists(FileName) then
  begin
    // Log (true,P_ERROR,WideFormat(_('Kann die angegebene Datei nicht finden: %s'),[FileName]));
    exit;
  end;

    ShExecInfoA.Wnd := GetForegroundWindow;
    ShExecInfoA.cbSize := sizeof(SHELLEXECUTEINFOA);
    ShExecInfoA.fMask := SEE_MASK_NOCLOSEPROCESS;
    ShExecInfoA.lpVerb := 'open';
    ShExecInfoA.lpFile := PAnsiChar(AnsiString(Filename));
    ShExecInfoA.lpParameters := PAnsiChar(AnsiString(Params));
    ShExecInfoA.lpDirectory := PAnsiChar(AnsiString(ExtractFileDir(Filename)));
    ShExecInfoA.nShow := WindowState;
    Result := ShellExecuteExA(@ShExecInfoA);
  try
    if Result then
    begin
        r := WaitForSingleObject(ShExecInfoA.hProcess, INFINITE);
    end;
  finally
      CloseHandle(ShExecInfoA.hProcess);
  end;
end;
und versuche nun via

ExecandWait('Ping.EXE','>> 192.168.212.253 >> testping.txt');
Es auch zu nutzen. Ich weiß, der Aufruf ist falsch, aber ich brauche hier Starthilfe, bitte.

Noch toller wäre es ja, 'n Ping direk tzu nutzen, aber nach 4-6 Stunden probieren aller möglichen Sachen, die durch die bank alle nicht klappten, wollte ich es eben über das doofe ping.exe lösen.

LG Shyran
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#2

AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC

  Alt 8. Sep 2011, 13:46
Du vermischst Ansi (SHELLEXECUTEINFOA) mit Unicode. Hast Du es einmal mit der Version aus #12 versucht? Der Aufruf an sich scheint ja soweit in Ordnung zu sein.

P.S.: Willkommen in der DP

[edit] Nachtrag: FileExists müsste in SysUtils stehen [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Shyran

Registriert seit: 31. Aug 2011
9 Beiträge
 
Delphi XE Professional
 
#3

AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC

  Alt 9. Sep 2011, 06:52
Hi,

danke für das Willkommen! *freu*

Und: Ja, habe ich probiert. Daher kam mein Einwand, dass er die "Wide"-Ausdrücke usw. beim Kompilieren nicht finden konnte und daher auch mein Umbau dazu. Nochmal deutlich: Die Funktion "WideFileExists" kannte er nicht. In den uses stehen die SysUtils drin, gerade eben nachgeschaut.

Noch eine Idee?

Grüßlis
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#4

AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC

  Alt 9. Sep 2011, 07:14
Die Funktion "WideFileExists" kannte er nicht.
Das geht mir genauso. Wo hast Du das denn her, ich kann in den Sourcen in diesem Thread nichts davon sehen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.343 Beiträge
 
Delphi 12 Athens
 
#5

AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC

  Alt 9. Sep 2011, 07:55
In XE ist ales schon "Wide" (Unicode)

FileExists ist mit UnicodeString (also String, seit Delphi 2009) deklariert.
#Und dann gibt es diese Typen und WinAPIs einmal mit A (ANSI), W (Wide aka Unicode) und ohne, wo es bis D2007 nach ANSI und ab D2009 nach Wide/Unicode gemappt (weitergeleitet) wird.

Es gibt noch gesonderste Units, in welchen z.B. zusärtliche Wide- oder (seit D2009) ANSI-Versionen verschiedenster Funktionen rumliegen.

So gibt es seit D2009 z.B. die Unit AnsiStrings, wo man ein StringReplace für ANSI findet, da das "normale" StringReplace ja nun für Unicode ausgelegt ist.

PS: Um dich zu verwirren: AnsiUpperCase ist (standardmäßig) Unicode (Codegear/Emba dachten es wäre so "leichter" für uns)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Sep 2011 um 07:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA

  Alt 17. Feb 2009, 09:24
Zitat:
ShExecInfo: SHELLEXECUTEINFO;
Das liefe dann aber nicht mehr unter Windows 98/ME etc, die noch nicht unicode-kompatibel sind.
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.343 Beiträge
 
Delphi 12 Athens
 
#7

Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA

  Alt 17. Feb 2009, 09:37
jupp, hatte ich auch schon germerkt

dann aber zumindestens noch 'ne Version, die mit dem arbeitet, was Delphi kann:
(bis D2007 in ANSI und ab WinNT und D2009 in Unicode)
Delphi-Quellcode:
function ExecAndWait(Filename, Params: String;
                     WindowState: Word = SW_SHOWNORMAL): boolean;
var
  {$IFDEF UNICODE} ShExecInfoW: SHELLEXECUTEINFOW; {$ENDIF}
  ShExecInfoA: SHELLEXECUTEINFOA;
// MSDN: ShellExecuteEx, ShellExecuteInfo
begin
  Result := false;
  if (Filename = '') or not FileExists(FileName) then
    exit;
  {$IFDEF UNICODE}
  if Win32IsUnicode then
  begin
    ShExecInfoW.Wnd := GetForegroundWindow;
    ShExecInfoW.cbSize := SizeOf(SHELLEXECUTEINFOW);
    ShExecInfoW.fMask := SEE_MASK_NOCLOSEPROCESS;
    ShExecInfoW.lpVerb := 'open';
    ShExecInfoW.lpFile := PWideChar(WideString(Filename));
    ShExecInfoW.lpParameters := PWideChar(WideString(Params));
    ShExecInfoW.lpDirectory := PWideChar(WideString(ExtractFileDir(Filename)));
    ShExecInfoW.nShow := WindowState;
    Result := ShellExecuteExW(@ShExecInfoW);
    try
      if Result then WaitForSingleObject(ShExecInfoW.hProcess, INFINITE);
    finally
      CloseHandle(ShExecInfoW.hProcess);
    end;
  end
  else
  {$ENDIF}
  begin
    ShExecInfoA.Wnd := GetForegroundWindow;
    ShExecInfoA.cbSize := sizeof(SHELLEXECUTEINFOA);
    ShExecInfoA.fMask := SEE_MASK_NOCLOSEPROCESS;
    ShExecInfoA.lpVerb := 'open';
    ShExecInfoA.lpFile := PAnsiChar(AnsiString(Filename));
    ShExecInfoA.lpParameters := PAnsiChar(AnsiString(Params));
    ShExecInfoA.lpDirectory := PAnsiChar(AnsiString(ExtractFileDir(Filename)));
    ShExecInfoA.nShow := WindowState;
    Result := ShellExecuteExA(@ShExecInfoA);
    try
      if Result then WaitForSingleObject(ShExecInfoA.hProcess, INFINITE);
    finally
      CloseHandle(ShExecInfoA.hProcess);
    end;
  end;
end;
[edit] noch schnell ein {$IFDEF UNICODE} eingefügt ... wenn Delphi eh standardmäßig kein Unicode kann, braucht man den Code ja hierbei nicht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA

  Alt 17. Feb 2009, 09:55
Nu isses perfekt!
Stefan
  Mit Zitat antworten Zitat
Jester101

Registriert seit: 3. Dez 2007
2 Beiträge
 
#9

Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA

  Alt 2. Mai 2009, 12:21
Hallo,

wie kann ich die Parameter auslesen, die das auszuführende Programm nach Ausführung zurückgibt?

Vielen Dank!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA

  Alt 2. Mai 2009, 12:34
Was für Parameter meinst du? ExitCode? Handle?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 22:55 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