es imposible elevar una sola fu nction o cualquier otra parte de un solo proceso, porque el nivel de elevación es un atributo por proceso. Al igual que con el embarazo, su proceso puede ser elevado o no. Si necesita que una parte de su código se ejecute elevada, debe iniciar un proceso por separado.
Sin embargo, si se puede poner en práctica su función como un objeto COM, se puede ejecutar elevado indirectamente, mediante la creación de un objeto COM elevada, así:
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);
}
El enlace al que se hace referencia ya no funciona. ¿Entonces sabes de otro? – cjbarth