![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Автогенерация в текущем десктопе. [D5, Win2k]
Анатолий © (2004-08-09 13:18:00)Возникла такая проблема:
нужно чтобы при запуске приложения для текущего десктопа автоматически не создавались окна или хуки. Мне необходимо подключиться к другой оконной станции и другому десктопу из неинтерактивноно голона. Но это срабатывает только если приложение не имеет окон или хуков в текущем десктопе.
В моем проекте сразу после первого Begin пытаюсь сменить десктоп. Не прокатывает. Тогда я добавляю опцию {$APPTYPE CONSOLE} и тогда десктоп сменяется. Вероятно, если тип приложения GUI, то что-то автоматически генерится еще до моего кода. Я проверил на тестовом приложении, без единой формы или окна. На совсем пустом проекте - там был только код смены десктопа, и ситуация аналогичная. Если приложение не консольное, то новый десктоп не присваивается, консольное - присваивается.
Дело в том, что моя прогрмма не может быть консольным приложением. В ней создаются окна и диалоги и т.д. И появление черного окошка консоли мне ни к чему. Как же мне добиться, чтобы до того, как я сменю десктоп, ничего автоматически не прогенерилось в текущем десктопе?
Игорь Шевченко (2004-08-09 16:31:00) [1]
> Хм.. значит, если включена {$APPTYPE CONSOLE}, то unit'ы
> не инициализируются?
проверяют IsConsole при инициализации (например, в Forms.pas)?
Анатолий (2004-08-09 15:46:00) [2]
> А посмотреть по секциям инициализации используемых unit'ов
> ?
Хм.. значит, если включена {$APPTYPE CONSOLE}, то unit'ы не инициализируются?
Игорь Шевченко (2004-08-09 14:56:00) [3]
> Вероятно, если тип приложения GUI, то что-то автоматически
> генерится еще до моего кода
А посмотреть по секциям инициализации используемых unit'ов ?
Анатолий (2004-08-09 14:46:00) [4]Эх, надо добавить перед 6 строкой с конца .. :)
var
hWinSta0 : HWINSTA;
hWinSta0x : HWINSTA;
hDefault : HDESK;
Анатолий (2004-08-09 14:43:00) [5]> А можно взглянуть на тестовый код?
Ошибку возвращает GetLastError после функции SetThreadDesktop если {$APPTYPE CONSOLE} не включить. Иначе - без проблем.
program desktop;
// {$APPTYPE CONSOLE} // можно с ним или без него
uses
SysUtils,
Dialogs,
Windows;
function MakeInteractive : Boolean;
// доступ к оконной станции обнулением DACL
function SetUserObjectFullAccess(hUserObject: THandle): Boolean;
var
Sd: PSecurity_Descriptor;
Si: Security_Information;
begin
Sd := PSecurity_Descriptor(LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));
InitializeSecurityDescriptor(Sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(Sd, True, nil, False);
Si := DACL_SECURITY_INFORMATION;
Result := SetUserObjectSecurity(hUserObject, Si, Sd);
LocalFree(HLOCAL(Sd));
end;
begin
Result := False;
// Откр. интерактивную оконную станцию с правами WRITE_DAC
hWinSta0x := OpenWindowStation('WinSta0', FALSE, WRITE_DAC);
if hWinSta0x = 0 then
begin
CloseWindowStation(hWinSta0x);
Exit;
end;
// Уст. права доступа
if not SetUserObjectFullAccess(hWinSta0x) then
begin
CloseWindowStation(hWinSta0x);
Exit;
end;
CloseWindowStation(hWinSta0x);
// Откр. интерактивную оконную станцию с рабочими правами
hWinSta0 := OpenWindowStation('WinSta0', FALSE, WINSTA_READSCREEN);
if hWinSta0 = 0 then
begin
CloseWindowStation(hWinSta0);
Exit;
end;
// Уст. интерактивную оконную станцию для приложения
if not SetProcessWindowStation(hWinSta0) then
begin
CloseWindowStation(hWinSta0);
Exit;
end;
CloseWindowStation(hWinSta0);
// Откр. текущий интерактивный десктоп
hDefault := OpenDesktop('Default', 0, FALSE,
DESKTOP_CREATEMENU or
DESKTOP_CREATEWINDOW or
DESKTOP_READOBJECTS or
DESKTOP_SWITCHDESKTOP or
DESKTOP_WRITEOBJECTS);
if hDefault = 0 then
Exit;
// Уст. текущий интерактивный десктоп для приложения
if not SetThreadDesktop(hDefault) then
begin
CloseDesktop(hDefault);
Exit;
end;
Result := True;
end;
procedure CloseInteractive;
begin
CloseDesktop(hDefault);
CloseWindowStation(hWinSta0);
end;
begin
if not MakeInteractive then
Terminate;
ShowMessage('OK');
CloseInteractive;
end.
Cobalt (2004-08-09 14:01:00) [6]> На совсем пустом проекте - там был только код смены десктопа, и ситуация аналогичная. Если приложение не консольное, то новый десктоп не присваивается, консольное - присваивается.
А можно взглянуть на тестовый код?