J'utilise CreateDesktop() pour créer un bureau temporaire sur lequel une application s'exécutera, effectuera une action de nettoyage (tout en restant à l'écart) et se terminera. Je ferme ce bureau une fois l'application disparue. Tout va bien lorsque vous utilisez Windows XP et même Vista. Le problème se pose lorsque vous activez le (ennuyeux) UAC.CreateDesktop() avec Vista UAC (Windows C)
Tout est OK lorsque vous créez un bureau, mais lorsque vous appelez CreateProcess() pour ouvrir un programme sur ce bureau, il provoque le blocage de l'application ouverte avec une exception sur User32.dll.
J'ai lu beaucoup de choses sur les différents bureaux et couches sur Windows et les restrictions de la mémoire. Cependant, la plupart des programmes que j'ouvre (en tant que scénarios de test) sont OK, mais certains (comme IE, Notepad, Calc et ma propre application) provoquent le crash.
Quelqu'un a une idée de ce qui se passe sur Vista avec UAC, ou plus précisément pour ces programmes spécifiques? et comment résoudre ce problème?
Quelqu'un a un bon exemple solide sur la façon de créer un bureau et y ouvrir une application sans passer sous Vista avec UAC?
Le code est apprécié.
Merci
EDIT: Voici le code que je utilise.
//Security
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;
EDIT pour Bounty La réponse actuelle propesed NE COMPTEZ PAS comme une réponse, s'il vous plaît ne définissez pas comme la réponse à la prime si le temps de la prime arrive à expiration.
J'ai appuyé sur "accepter" par erreur. J'ai posé la question à CreateDesktop() with vista and UAC on (C, windows)
Utilisez-vous vraiment CreateProcess pour lancer le processus? Ou ShellExecute? Si CreateProcess découvre une 'violation' UAC, il devrait simplement renvoyer une erreur UAC. ShellExecute - répond aux erreurs d'UAC en déclenchant le processus d'élévation d'UAC que je pourrais comprendre échouer sur n'importe quel bureau n'exécutant pas explorer.exe comme le shell. –
CreateProcess() mais je ne reçois aucune erreur. La seule chose que je reçois en retour est le crash du programme que j'ai ouvert dans le nouveau bureau. – wonderer