CreateDesktop () com vista e UAC em (C, windows)

Eu perguntei isso emCreateDesktop () com o Vista UAC (Windows C) Eu estabeleci uma recompensa, mas ao tentar votar a única resposta, o "aceitar" foi pressionado por engano (eu estive acordado por mais de 48 horas). então estou perguntando de novo.

Eu estou usando CreateDesktop () para criar um desktop temporário onde um aplicativo será executado, executar uma ação de limpeza (enquanto permanecer fora do caminho) e encerrar. Estou fechando a área de trabalho depois que o aplicativo é removido. Tudo está bem ao usar o Windows XP e até mesmo o Vista. O problema surge quando você ativa o UAC (chato).

Tudo está OK quando você cria uma área de trabalho, mas quando você chama CreateProcess () para abrir um programa nessa área de trabalho faz com que o aplicativo aberto travar com uma exceção no User32.dll.

Eu tenho lido muito sobre os diferentes desktops e camadas no Windows e as restrições de memória. No entanto, a maioria dos programas que eu abro (como cenários de teste) está OK, mas alguns (como o IE, Notepad, Calc e meu próprio aplicativo) causam a falha.

Alguém tem alguma idéia por que isso acontece no Vista com o UAC, ou mais especificamente para esses programas específicos? e como consertar isso?

Alguém tem um bom exemplo sólido sobre como criar um desktop e abrir um aplicativo lá sem alternar para ele com o Vista com o UAC ativado?

Código é apreciado.

obrigado

O código usado é

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;

questionAnswers(2)

yourAnswerToTheQuestion