Entwickler-Ecke

Windows API - Zugriffsverletzung in CreateProcess - GetConsoleOutput


Webo - Di 15.02.11 11:54
Titel: Zugriffsverletzung in CreateProcess - GetConsoleOutput
Moin, moin ...

Ich experimentiere grade mit diesem Code [http://www.delphi-treff.de/tipps/system/prozesse/ausgabe-der-konsole-in-meinem-programm-anzeigen/] herum. Allerdings funktioniert es bei mir schon so nicht, wie er da steht. Ich weiß, dass ich damit früher schonmal rumgespielt habe und da hat es funktioniert.
So, zum Fehler: Ich habe zuerst einfach das Beispiel von dort genommen. Es kommt aber eine Zugriffsverletzung, siehe Anhang. Das passiert unter Windows 7, als auch in einer XP-VM. Ich bin das mal durchgegangen und der Fehler tritt in der Zeile

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 if CreateProcess(nil,
                   PChar(Command),
                   nil,
                   nil,
                   True,
                   CreationFlags,
                   nil,
                   nil,
                   StartupInfo,
                   ProcessInfo) then
  begin

auf.
Jetzt bin ich irgendwie ratlos, wie ich den Fehler beheben könnte. Vielleicht weiß von Euch jmd Rat ?

MfG

Webo


PS: Ausführen als Administrator brachte auch keinen Erfolg.


jaenicke - Di 15.02.11 12:39

Das ist bestimmt ein Unicodeproblem, wenn du D2010 grad nutzt. Ich kanns grad nicht testen, versuchs erst einmal mit Ansistrings, ich schaue es mir zu Hause einmal an:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function GetConsoleOutput(const Command : AnsiString;
                          Output, Errors : TStringList) : Boolean;
var
  Buffer            : array[0..255of AnsiChar;
  StartupInfo       : TStartupInfoA;

...


  if CreateProcessA(nil,
                   PAnsiChar(Command),
...
// EDIT:
Die Deklaration in Delphi ist falsch bzgl. Unicode, siehe MSDN Doku, mehr heute Abend...
// EDIT2:
http://www.delphifeeds.com/go/s/62569


Webo - Mi 16.02.11 12:46

Danke für die Antwort. Warum es nicht funktioniert habe ich jetzt verstanden, aber wie genau ändert man das ? Auf der verlinkten Seite steht ja, dass man sich zwei neue, überladene Funktionen nutzen muss. Nur wie ? :D


jaenicke - Fr 18.02.11 12:17

Einfachster Fix:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  if CreateProcess(nil,
                   PChar(Command + ''),
                   nil,
                   nil,
                   True,
                   CreationFlags,
                   nil,
                   nil,
                   StartupInfo,
                   ProcessInfo) then
  begin


Webo - Fr 18.02.11 19:30

Funktioniert. Dankeschön! 8)