Wer die Units OleServer und/oder OleCtrls einbindet und SetThreadDesktop im Hauptthread aufruft, der wird den Fehler 170 (Ressource wird bereits verwendet) bekommen.
Das liegt daran, dass die beiden Units im initialization Teil ein Fensterhandle (oder derartiges) erstellen. Ich habe das nicht weiter untersucht.
Dieser Fehler kommt nicht unter Delphi7. Jedoch wohl in allen
BDS Versionen. Andere Versionen hab ich nicht testen können.
Lösung:
Wenn man wirklich beides braucht, dann muss man SetThreadDesktop in einen anderen Thread auslagern.
Apollonius hat mal freundlicherweise ein Beispiel geschrieben.
Delphi-Quellcode:
program TrySetThreadDesktop;
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows
OleServer,
OleCtrls;
var Old, New: Cardinal;
begin
Old:=GetThreadDesktop(GetCurrentThreadID);
try
New:=CreateDesktop('MyDesktop', nil, nil, 0, GENERIC_ALL, nil);
try
if not SetThreadDesktop(New) then
Writeln(SysErrorMessage(GetLastError))
else
begin
SetThreadDesktop(Old);
Writeln('Success');
end;
finally
CloseDesktop(New);
end;
finally
CloseDesktop(Old);
end;
Readln;
end.
Der Fehler ensteht sofort beim ersten SetThreadDesktop.