Pregunté esto en CreateDesktop() with Vista UAC (C Windows) Configuré una recompensa pero al tratar de rechazar la única respuesta, se presionó "aceptar" por error (estuve despierto por más de 48 hs). así que lo estoy preguntando de nuevo.CreateDesktop() con vista y UAC en (C, Windows)
Estoy usando CreateDesktop() para crear un escritorio temporal donde se ejecutará una aplicación, realizar una acción de limpieza (mientras se mantiene fuera del camino) y terminar. Estoy cerrando ese escritorio una vez que la aplicación se haya ido. Todo está bien cuando se usa Windows XP e incluso Vista. El problema surge cuando habilita el UAC (molesto).
Todo está bien cuando crea un escritorio, pero cuando llama a CreateProcess() para abrir un programa en ese escritorio provoca que la aplicación abierta se bloquee con una excepción en User32.dll.
He estado leyendo mucho sobre los diferentes escritorios y capas en Windows y las restricciones de memoria. Sin embargo, la mayoría de los programas que abro (como escenarios de prueba) están bien, pero algunos (como IE, Notepad, Calc y mi propia aplicación) provocan el bloqueo.
¿Alguien tiene alguna idea de por qué sucede esto en Vista con UAC, o más específicamente para esos programas específicos? y cómo arreglar esto?
¿Alguien tiene un buen ejemplo sólido sobre cómo crear un escritorio y abrir una aplicación allí sin cambiar a él en Vista con UAC activado?
Código es apreciado.
Gracias
El código utilizado es
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;
¿Estás haciendo esto en un hilo de interfaz de usuario? – Isaac
Significado? Quiero decir, estoy llamando a CreateDesktop desde el hilo principal de la aplicación – wonderer
Una traza de pila sería muy útil también – jcopenha