เป็นไปไม่ได้ที่จะยกระดับเพียงฟังก์ชันเดียวหรือส่วนอื่นๆ ของกระบวนการเดียว เนื่องจากระดับระดับความสูงเป็นคุณลักษณะต่อกระบวนการ เช่นเดียวกับการตั้งครรภ์ กระบวนการของคุณสามารถยกระดับได้หรือไม่ก็ได้ หากคุณต้องการให้โค้ดบางส่วนได้รับการยกระดับ คุณต้องเริ่มกระบวนการแยกต่างหาก
อย่างไรก็ตาม หากคุณสามารถใช้ฟังก์ชันของคุณเป็นวัตถุ COM คุณสามารถเรียกใช้ฟังก์ชันดังกล่าวแบบยกระดับทางอ้อม โดยการสร้างวัตถุ COM แบบยกระดับ เช่นนี้
HRESULT
CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv)
{
WCHAR monikerName[1024];
WCHAR clsid[1024];
BIND_OPTS3 bo;
StringFromGUID2 (guid, clsid, sizeof (clsid) / 2);
swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid);
memset (&bo, 0, sizeof (bo));
bo.cbStruct = sizeof (bo);
bo.hwnd = hwnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
// Prevent the GUI from being half-rendered when the UAC prompt "freezes" it
MSG paintMsg;
int MsgCounter = 5000; // Avoid endless processing of paint messages
while (PeekMessage (&paintMsg, hwnd, 0, 0, PM_REMOVE | PM_QS_PAINT) != 0 && --MsgCounter > 0)
{
DispatchMessage (&paintMsg);
}
return CoGetObject (monikerName, &bo, iid, ppv);
}
person
Andrei Belogortseff
schedule
18.09.2008