Ich habe den Code etwas umgebaut und sieht jetzt so aus:
Delphi-Quellcode:
uses MpuWinNT;
function CreateProcessAsLogon(const User, PW, Application: string):
Boolean;
var
s : string;
si : TStartupInfoW;
pif : TProcessInformation;
wUser : PWideChar;
wPW : PWideChar;
wApp : PWideChar;
begin
si.cb := SizeOf(TStartupInfoW);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := 1;
si.lpReserved := nil;
si.lpDesktop := nil;
si.lpTitle := nil;
wAPP := GetMemory(length(Application) * 2);
wApp := StringToWideChar(Application, wApp, length(Application) * 2);
wUser := GetMemory(length(User) * 2);
wUser := StringToWideChar(User, wUser, length(User) * 2);
wPW := GetMemory(length(PW) * 2);
wPW := StringToWideChar(PW, wPW, length(PW) * 2);
result := CreateProcessWithLogonW(wUser, '', wPW, LOGON_WITH_PROFILE,
nil, wApp, CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pif);
FreeMem(wUser);
FreeMem(wPW);
FreeMem(wApp);
end;
Das witzige ist: So bald ich die Stringvariable
s auskommentiere, wird der Prozess nicht mehr gestartet und ich bekomme den Fehler: "
Falscher Parameter".
Das passiert sowohl mit
GetMemory,
AllocMem und als auch mit
GetMem. Lasse ich es drinne, läuft alles prima. Das gleiche passiert, wenn ich die Speicherreservierung und -freigabe in einem try-finally-Block kapsele. irgendwas bringt da meinen Speicher mächtig durcheinander.
Ächtz. Jetzt habe ich es in einen try-finally-Block gekapselt,
s auskommentiert und es kommt der Fehler, wenn ich Return drücke, wenn der Button den Fokus hat. Klicke ich mit der Maus, klappt es.
Die
Unit MpuWinNT befindet sich im Anhang.