Tôi đã hỏi điều này trong CreateDesktop() with Vista UAC (C Windows) Tôi đặt tiền thưởng nhưng cố gắng bỏ phiếu cho câu trả lời duy nhất "chấp nhận" đã bị nhầm lẫn (tôi đã tỉnh táo vì hơn 48 giờ). vì vậy tôi hỏi lại.CreateDesktop() với vista và UAC trên (C, windows)
Tôi đang sử dụng CreateDesktop() để tạo một máy tính để bàn tạm thời, nơi ứng dụng sẽ chạy, thực hiện thao tác dọn dẹp (trong khi còn lại) và chấm dứt. Tôi đóng máy tính để bàn đó khi ứng dụng đã biến mất. Mọi thứ đều ổn khi sử dụng Windows XP và thậm chí cả Vista. Vấn đề phát sinh khi bạn kích hoạt UAC (gây phiền nhiễu).
Mọi thứ đều ổn khi bạn tạo một màn hình, nhưng khi bạn gọi CreateProcess() để mở chương trình trên màn hình đó, ứng dụng đã mở bị lỗi với ngoại lệ trên User32.dll.
Tôi đã đọc rất nhiều về các máy tính để bàn và lớp khác nhau trên Windows và các hạn chế về bộ nhớ. Tuy nhiên, hầu hết các chương trình tôi mở (như các kịch bản thử nghiệm) đều OK, nhưng một vài chương trình (như IE, Notepad, Calc và ứng dụng của riêng tôi) gây ra sự cố.
Bất cứ ai cũng có ý tưởng tại sao điều này xảy ra trên Vista với UAC, hoặc cụ thể hơn cho các chương trình cụ thể đó? và cách khắc phục điều này?
Bất cứ ai cũng có một ví dụ vững chắc về cách tạo một máy tính để bàn và mở một ứng dụng ở đó mà không cần chuyển sang ứng dụng dưới Vista với UAC?
Mã được đánh giá cao.
Cảm ơn
Mã được sử dụng là
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;
Bạn đang làm điều này trong một chuỗi giao diện người dùng? – Isaac
Ý nghĩa? Ý tôi là, tôi đang gọi CreateDesktop từ chủ đề chính của ứng dụng – wonderer
Một dấu vết ngăn xếp sẽ khá hữu ích cũng như – jcopenha