【发布时间】:2019-10-10 18:47:33
【问题描述】:
我在CreateDesktop() with Vista UAC (C Windows) 中问过这个问题 我设置了赏金,但在试图否决唯一的答案时,错误地按下了“接受”(我已经醒了 48 小时以上)。所以我再问一遍。
我正在使用 CreateDesktop() 创建一个临时桌面,应用程序将在其中运行、执行清理操作(同时保持不碍事)并终止。应用程序消失后,我将关闭该桌面。使用 Windows XP 甚至 Vista 时一切正常。当您启用(烦人的)UAC 时,就会出现问题。
创建桌面时一切正常,但是当您调用 CreateProcess() 在该桌面上打开程序时,会导致打开的应用程序崩溃,并在 User32.dll 上出现异常。
我已经阅读了很多关于 Windows 上不同桌面和层以及内存限制的信息。但是,我打开的大多数程序(作为测试场景)都可以,但有一些程序(例如 IE、记事本、Calc 和我自己的应用程序)会导致崩溃。
任何人都知道为什么在带有 UAC 的 Vista 上会发生这种情况,或者更具体地说是针对那些特定程序?以及如何解决这个问题?
任何人都有一个很好的例子来说明如何在打开 UAC 的 Vista 下创建桌面并在其中打开应用程序而不切换到它?
感谢代码。
谢谢
使用的代码是
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;
【问题讨论】:
-
您是在 UI 线程中执行此操作吗?
-
意义?我的意思是,我正在从应用程序的主线程调用 CreateDesktop
-
堆栈跟踪也很有帮助
-
正如我在 cmets 关于我的答案中所说的,这可能不是您想要的答案,但它肯定是一个完全有效的答案。如果您需要更多帮助,我很乐意提供帮助,但不要任性地宣称您对您得到的答案感到失望,您最好使用它们来更深入地挖掘手头的问题。
-
好吧,首先谢谢。我首先在这里问的原因是因为我已经浪费了几个星期试图自己挖掘答案。否则我不会问。我不想变得粗鲁,但 10 次中有 9 次我看到人们在编程论坛上提问,他们从来没有得到直接的答案。所有得到的是“尝试 X 并尝试 Y”,然后是“也许你可以尝试 Z”。这样的答案只会让人更加困惑。
标签: c windows windows-vista uac