CreateDesktop () z podglądem i UAC na (C, Windows)

Poprosiłem o toCreateDesktop () z Vista UAC (C Windows) Ustawiłem nagrodę, ale próbując zagłosować, jedyna odpowiedź, którą „akceptuję” została naciśnięta przez pomyłkę (nie spałem przez ponad 48 godzin). więc proszę o to ponownie.

Używam CreateDesktop (), aby utworzyć tymczasowy pulpit, na którym uruchomi się aplikacja, wykonać akcję czyszczenia (pozostając poza zasięgiem) i zakończyć. Zamykam ten pulpit, gdy aplikacja zniknie. Wszystko jest w porządku podczas korzystania z Windows XP, a nawet Vista. Problem pojawia się, gdy włączasz (irytujące) UAC.

Wszystko jest w porządku, gdy tworzysz pulpit, ale kiedy wywołujesz CreateProcess (), aby otworzyć program na tym pulpicie, powoduje to awarię otwartej aplikacji z wyjątkiem User32.dll.

Czytałem dużo o różnych komputerach i warstwach w systemie Windows i ograniczeniach pamięci. Jednak większość programów, które otwieram (jako scenariusze testowe) jest OK, ale kilka (jak IE, Notatnik, Calc i moja własna aplikacja) powoduje awarię.

Każdy ma jakiś pomysł, dlaczego tak się dzieje na Vista z UAC, a dokładniej dla tych konkretnych programów? i jak to naprawić?

Czy ktoś ma dobry przykład na to, jak utworzyć pulpit i otworzyć tam aplikację bez przełączania się na nią w systemie Vista z UAC?

Kod jest doceniany.

Dzięki

Użyty kod to

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