Zapytałem o to w CreateDesktop() with Vista UAC (C Windows) Ustawiłem nagrodę, ale próbując zagłosować jedyną odpowiedzią, przez pomyłkę naciśnięto "zaakceptuj" (czułem się więcej niż 48 godzin). więc proszę o to ponownie.CreateDesktop() z vista i UAC na (C, Windows)
Używam CreateDesktop(), aby utworzyć tymczasowy pulpit, na którym uruchomiona zostanie aplikacja, wykonać akcję czyszczącą (pozostając na uboczu) i zakończyć działanie. Zamykam ten pulpit, gdy aplikacja zniknie. Wszystko jest w porządku podczas korzystania z systemu Windows XP, a nawet Vista. Problem pojawia się, gdy włączysz (denerwujący) UAC.
Wszystko jest w porządku po utworzeniu pulpitu, ale po wywołaniu CreateProcess() w celu otwarcia programu na tym komputerze powoduje on awarię uruchomionej aplikacji z wyjątkiem na 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 w porządku, ale kilka (jak IE, Notepad, Calc i moja własna aplikacja) powoduje awarię.
Ktoś ma pojęcie, dlaczego tak się dzieje w systemie Vista z UAC, a dokładniej z tymi konkretnymi programami? i jak to naprawić?
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 na?
Kod jest mile widziany.
Dzięki
Kod stosowany jest
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;
Czy robisz to w wątku UI? – Isaac
Czyli? Mam na myśli, nazywam CreateDesktop z głównego wątku aplikacji – wonderer
Śledzenie stosu byłoby całkiem pomocne również – jcopenha