2009-07-27 6 views
3

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)

+0

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. –

+0

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

Répondre

2

Problème intéressant ... Je ne m'attendrais pas à une différence entre le scénario UAC/non-UAC sauf si le programme lancé nécessite des privilèges d'administrateur (et je doute que soit le bloc-notes soit calc). De toute façon, avez-vous essayé de définir le bureau du thread avant d'appeler CreateProcess()?

HDESK hOld = GetThreadDesktop(GetCurrentThreadId()); 
HDESK hNew = OpenDesktop("name", 0, FALSE, GENERIC_ALL); 
SetThreadDesktop(hNew); 
CreateProcess(...); 
SetThreadDesktop(hOld); 
CloseDesktop(hNew); 
+0

non, mais j'essaie maintenant. Question, pourquoi utilisez-vous OpenDesktop() et pas CreateDesktop()? sauf si vous le créez et l'ouvrez ensuite? – wonderer

+0

non. Il s'écrase toujours ... – wonderer

+0

J'ai peut-être mal compris votre question. Lancez-vous l'application à partir du même thread que celui que vous utilisez pour créer le bureau? Je soupçonne que le réglage du bureau de thread peut toujours être le problème. SetThreadDesktop() échouera si le thread appelant possède des fenêtres sur le bureau actuel. Il est prudent de supposer que CreateDesktop échouera à définir le bureau du thread pour la même raison, même s'il crée avec succès le nouveau bureau. –

Questions connexes