function InitServiceDesktop: boolean;
var
dwThreadId: DWORD;
begin
{$IFDEF DEBUG}CreateLog('InitServiceDesktop');{$ENDIF}
dwThreadId := GetCurrentThreadID;
// Ensure connection to service window station and desktop, and
// save their handles.
hwinstaSave := GetProcessWindowStation;
hdeskSave := GetThreadDesktop(dwThreadId);
hwinstaUser := OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED);
if hwinstaUser = 0 then
begin
{$IFDEF DEBUG}CreateLog('OpenWindowStation failed' + SysErrorMessage(GetLastError)){$ENDIF};
Result := false;
exit;
end;
if not SetProcessWindowStation(hwinstaUser) then
begin
{$IFDEF DEBUG}CreateLog('SetProcessWindowStation failed'){$ENDIF};
Result := false;
exit;
end;
hdeskUser := OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED);
if hdeskUser = 0 then
begin
{$IFDEF DEBUG}CreateLog('OpenDesktop failed'){$ENDIF};
SetProcessWindowStation(hwinstaSave);
CloseWindowStation(hwinstaUser);
Result := false;
exit;
end;
Result := SetThreadDesktop(hdeskUser);
if not Result then
{$IFDEF DEBUG}CreateLog('SetThreadDesktop' + SysErrorMessage(GetLastError)){$ENDIF};
end;
procedure DoneServiceDeskTop;
begin
{$IFDEF DEBUG}CreateLog('DoneServiceDesktop');{$ENDIF}
// Restore window station and desktop.
SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hwinstaSave);
if hwinstaUser <> 0 then
CloseWindowStation(hwinstaUser);
if hdeskUser <> 0 then
CloseDesktop(hdeskUser);
end;