Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
So ein Mist. So geht es jetzt:
Delphi-Quellcode:
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:
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; 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] *************************************************************} |
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
Zitat:
Delphi-Quellcode:
So würde zumindest ich es machen ;-)
CreateProcessBlubb(...);
result := GetLastError; 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:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
Naja, ich glaube du hast mich nur wie immer falsch verstanden ;-) Zitat:
|
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.
|
Re: Rückgabewert von CreateProcessWithLogonW und GetLastErro
Zitat:
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; |
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. |
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