CreateDesktop () mit Vista und UAC auf (C, Windows)

Ich habe das in gefragtCreateDesktop () mit Vista UAC (C Windows) Ich habe ein Kopfgeld festgesetzt, aber beim Versuch, die einzige Antwort abzustimmen, wurde versehentlich das "Annehmen" gedrückt (ich bin seit mehr als 48 Stunden wach). also frage ich es nochmal.

Ich verwende CreateDesktop () zum Erstellen eines temporären Desktops, auf dem eine Anwendung ausgeführt wird, führe eine Bereinigungsaktion durch (ohne dabei im Weg zu stehen) und beende sie. Ich schließe diesen Desktop, sobald die Anwendung verschwunden ist. Alles ist in Ordnung, wenn Sie Windows XP und sogar Vista verwenden. Das Problem tritt auf, wenn Sie die (lästige) Benutzerkontensteuerung aktivieren.

Alles ist in Ordnung, wenn Sie einen Desktop erstellen. Wenn Sie jedoch CreateProcess () aufrufen, um ein Programm auf diesem Desktop zu öffnen, stürzt die geöffnete Anwendung mit einer Ausnahme für User32.dll ab.

Ich habe viel über die verschiedenen Desktops und Ebenen unter Windows und die Einschränkungen des Arbeitsspeichers gelesen. Die meisten Programme, die ich (als Testszenarien) öffne, sind jedoch in Ordnung, aber einige (wie IE, Editor, Calc und meine eigene Anwendung) verursachen den Absturz.

Hat jemand eine Idee, warum dies unter Vista mit UAC passiert, oder genauer gesagt für diese spezifischen Programme? und wie kann man das beheben?

Hat jemand ein gutes solides Beispiel dafür, wie man einen Desktop erstellt und dort eine Anwendung öffnet, ohne unter Vista mit aktivierter Benutzerkontensteuerung zu dieser zu wechseln?

Code wird geschätzt.

Vielen Dank

Der verwendete Code ist

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;

Antworten auf die Frage(2)

Ihre Antwort auf die Frage