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;

Ответы на вопрос(2)

Ваш ответ на вопрос