में मैंने यह पूछा है कि मैंने CreateDesktop() with Vista UAC (C Windows) में यह एक बाउंटी सेट किया है, लेकिन केवल जवाब देने का प्रयास करने में "स्वीकृति" गलती से दबाया गया था (मैं जाग गया हूं 48 एचएस से अधिक)। तो मैं इसे फिर से पूछ रहा हूँ।विस्टा और यूएसी (सी, विंडोज़)
मैं एक अस्थायी डेस्कटॉप जहां एक आवेदन चलेंगे बनाने के लिए CreateDesktop() का उपयोग कर रहा है, एक सफाई क्रिया को निष्पादित (रास्ते से बाहर रहते हुए) और समाप्त। आवेदन समाप्त होने के बाद मैं उस डेस्कटॉप को बंद कर रहा हूं। Windows XP और यहां तक कि Vista का उपयोग करते समय सब कुछ ठीक है। समस्या तब उत्पन्न होती है जब आप (परेशान) यूएसी सक्षम करते हैं।
सब कुछ ठीक है जब आप एक डेस्कटॉप बनाने के लिए, लेकिन जब आप CreateProcess फोन() कि डेस्कटॉप यह User32.dll पर एक अपवाद के साथ दुर्घटना के लिए खोला आवेदन का कारण बनता है पर एक कार्यक्रम को खोलने के लिए।
मैं विंडोज पर विभिन्न डेस्कटॉप और परतों और स्मृति के प्रतिबंध के बारे में एक बहुत कुछ पढ़ रहा है। हालांकि, अधिकांश कार्यक्रम जो मैं खोलता हूं (परीक्षण परिदृश्य के रूप में) ठीक है, लेकिन कुछ (जैसे आईई, नोटपैड, कैल्क और मेरा स्वयं का एप्लीकेशन) दुर्घटना का कारण बनता है।
किसी को भी कोई विचार है कि यह यूएसी के साथ 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;
क्या आप इसे यूआई थ्रेड में कर रहे हैं? – Isaac
मतलब? मेरा मतलब है, मैं एप्लिकेशन के मुख्य धागे से CreateDesktop को कॉल कर रहा हूं – wonderer
एक स्टैक ट्रेस भी बहुत मददगार होगा – jcopenha