Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rückgabewert von CreateProcessWithLogonW und GetLastError (https://www.delphipraxis.net/38439-rueckgabewert-von-createprocesswithlogonw-und-getlasterror.html)

Luckie 24. Jan 2005 00:05

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
So ein Mist. So geht es jetzt:
Delphi-Quellcode:
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString; var LastError: DWORD):
  LongBool;
var
  si          : TStartupInfoW;
  pif         : TProcessInformation;
begin
  ZeroMemory(@si, sizeof(si));
  si.cb := sizeof(si);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := 1;

  result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW),
    LOGON_WITH_PROFILE, nil, PWideChar(Application+' "'+CmdLine+'"'),
    CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif);

  if not result then
    MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), APPNAME, MB_ICONSTOP);
end;
Auch mit Parametern. Aber das ist Mist, weil dann die aufrufende Routine die Fehlerbehandlung nicht machen kann. Und so was gefällt mir nicht. Wollte ich jetzt keine Fehlermeldung haben, müsste ich im Code rumfuschen. :roll:

Hier übrigens dein feuchter Händedruck:
Delphi-Quellcode:
{************************************************************}
{                                                            }
{                   RunAsUser - Version 1.1                  }
{                                                            }
{               Copyright (c) 2005 Michael Puff             }
{                                                            }
{  When I die I want 'Hello, world' carved on my headstone. }
{                                                            }
{************************************************************}

{*************************************************************

  History:

    - 2005-01-24 - 1.1
      GetLastError-Bug in CreateProcessAsLogon von tommie-lie
      gefunden:
      [url]http://www.delphipraxis.net/post306577.html#306577[/url]

*************************************************************}
;)

tommie-lie 24. Jan 2005 12:34

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Zitat:

Zitat von Luckie
So ein Mist. So geht es jetzt:
Delphi-Quellcode:
  result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW),
    LOGON_WITH_PROFILE, nil, PWideChar(Application+' "'+CmdLine+'"'),
    CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif);

  if not result then
    MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), APPNAME, MB_ICONSTOP);

Ja, so hatte ich es ja auch ausprobiert.

Zitat:

Zitat von Luckie
Aber das ist Mist, weil dann die aufrufende Routine die Fehlerbehandlung nicht machen kann.

Du könntest als Rückgabewert den Wert von GetLastError zurückgeben:
Delphi-Quellcode:
CreateProcessBlubb(...);
  result := GetLastError;
So würde zumindest ich es machen ;-)
Wenn CreateProcessWithLogonW() True zurückgegeben hat, müsste GetLastError() ja 0 sein. Und andernfalls hat es halt einen bestimmten Fehlerwert. In der Aufruffunktion überprüfst du dann das Ergebnis auf 0 und gibst entsprechend die Fehlermeldung passend zum Fehlercode aus, sofern die Funktion nicht 0 zurückliefert. Erfordert zwar eine weitere Variable, aber der Compiler sollte sie in ein Register packen können (wäre glaub' ich sogar schneller, weil nur ein Wert geladen wird :gruebel: Schwachsinn, stattdessen wird er vorher geladen, macht absolut keinen Unterschied, wenn der Compiler die Variable in ein Register packt).

Zitat:

Zitat von Luckie
Hier übrigens dein feuchter Händedruck:

Der trieft ja schon fast ;-)

Luckie 24. Jan 2005 14:51

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von Luckie
Aber das ist Mist, weil dann die aufrufende Routine die Fehlerbehandlung nicht machen kann.

Du könntest als Rückgabewert den Wert von GetLastError zurückgeben:
Delphi-Quellcode:
CreateProcessBlubb(...);
  result := GetLastError;
So würde zumindest ich es machen ;-)
Wenn CreateProcessWithLogonW() True zurückgegeben hat, müsste GetLastError() ja 0 sein. Und andernfalls hat es halt einen bestimmten Fehlerwert. In der Aufruffunktion überprüfst du dann

Habe ich auch probiert, wird auch 0 zurückgegeben, wenn der Aufruf fehlschlägt. Aber danke für die ausführliche Erläuterung wie man GetLastError auswertet. ;)

tommie-lie 24. Jan 2005 15:00

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Zitat:

Zitat von Luckie
Habe ich auch probiert, wird auch 0 zurückgegeben, wenn der Aufruf fehlschlägt.

Hmm? Ich denke das Problem haben wir gerade gelöst? :gruebel:
Naja, ich glaube du hast mich nur wie immer falsch verstanden ;-)

Zitat:

Zitat von Luckie
Aber danke für die ausführliche Erläuterung wie man GetLastError auswertet. ;)

Gern geschehen :mrgreen:

Luckie 24. Jan 2005 15:03

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Es funktioniert, wenn GetLastWrror direkt in der Routine ausgewertet wird, nicht aber wenn ich GetLastError zurückgeben lasse.

tommie-lie 24. Jan 2005 15:15

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Zitat:

Zitat von Luckie
Es funktioniert, wenn GetLastWrror direkt in der Routine ausgewertet wird, nicht aber wenn ich GetLastError zurückgeben lasse.

:gruebel:
Also bei mir geht das, auch wenn ich GetLastError() zurückgebe:
Delphi-Quellcode:
function CreateProcessAsLogon(const User, PW, Application, CmdLine: WideString):
  LongWord;
var
  si          : TStartupInfoW;
  pif         : TProcessInformation;
begin
  ZeroMemory(@si, sizeof(si));
  si.cb := sizeof(si);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := 1;

  SetLastError(0);
  CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW),
    LOGON_WITH_PROFILE, nil, PWideChar(Application+' "'+CmdLine+'"'),
    CREATE_DEFAULT_ERROR_MODE, nil, nil, @si, @pif);
  Result := GetLastError;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  lasterror: LongWord;
begin
  lasterror := CreateProcessAsLogon(Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text);
  if LastError <> 0 then
    MessageBox(Application.Handle, PChar(SysErrorMessage(LastError)), '', MB_ICONSTOP);
end;

Luckie 24. Jan 2005 15:31

Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
 
Verdammt, jetzt geht es bei mir auch. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Seite 4 von 4   « Erste     234   

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