CreateDesktop () с Vista и UAC на (C, Windows)
Я спросил это вCreateDesktop () с Vista UAC (C Windows) Я назначил щедрость, но, пытаясь отклонить единственный ответпринять» был нажат по ошибке (япроснулся более 48 часов). поэтому я спрашиваю это снова.
Используя CreateDesktop (), создайте временный рабочий стол, на котором будет запускаться приложение, выполните очистку (оставаясь в стороне) и завершите работу. Я'Я закрываю этот рабочий стол, как только приложение исчезло. Все хорошо при использовании Windows XP и даже Vista. Проблема возникает, когда вы включаете (раздражает) UAC.
Все в порядке, когда вы создаете рабочий стол, но когда вы вызываете CreateProcess (), чтобы открыть программу на этом рабочем столе, это вызывает сбой открытого приложения с исключением на User32.dll.I '
Мы много читали о различных рабочих столах и слоях в Windows и ограничениях памяти. Тем не менее, большинство программ, которые я открываю (в качестве тестовых сценариев), в порядке, но некоторые (такие как IE, Notepad, Calc и мое собственное приложение) вызывают сбой.
У кого-нибудь есть идеи, почему это происходит в Vista с UAC или, более конкретно, для этих конкретных программ? и как это исправить?
У кого-нибудь есть хороший убедительный пример того, как создать рабочий стол и открыть там приложение, не переключаясь на него в Vista с включенным UAC?
Код ценится.
Спасибо
Используемый код
SECURITY_ATTRIBUTES sa;
HDESK dOld;
HDESK dNew;
BOOL switchdesk, switchdesk2, closedesk;
int AppPid;
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
//Get handle to current desktop
dOld = OpenDesktopA("default", 0, TRUE, DESKTOP_SWITCHDESKTOP|
DESKTOP_WRITEOBJECTS|
DESKTOP_READOBJECTS|
DESKTOP_ENUMERATE|
DESKTOP_CREATEWINDOW|
DESKTOP_CREATEMENU);
if(!dOld)
{
printf("Failed to get current desktop handle !!\n\n");
return 0;
}
//Make a new desktop
dNew = CreateDesktopA("kaka", 0, 0, 0, DESKTOP_SWITCHDESKTOP|
DESKTOP_WRITEOBJECTS|
DESKTOP_READOBJECTS|
DESKTOP_ENUMERATE|
DESKTOP_CREATEWINDOW|
DESKTOP_CREATEMENU, &sa);
if(!dNew)
{
printf("Failed to create new desktop !!\n\n");
return 0;
}
AppPid = PerformOpenApp(SomeAppPath);
if(AppPid == 0)
{
printf("failed to open app, err = %d\n", GetLastError());
}
else
{
printf("App pid = %d\n", AppPid);
}
closedesk = CloseDesktop(dNew);
if(!closedesk)
{
printf("Failed to close new desktop !!\n\n");
return 0;
}
return 0;