/** * Get the shield icon for UAC. * * This method returns the small shield icon for UAC * on Vista and above. To be able to run this app also on * previous Windows versions, the function pointer to * SHGetStockIconInfo is obtained via GetProcAddress * (i.e. no link-time dependency). */ bool Win32Utils::getShieldIcon(wxBitmap &shieldBM) { HMODULE hShellDLL; HRESULT hr; bool isOK = true; HRESULT (CALLBACK* pfnSHGetStockIconInfo)(SHSTOCKICONID siid, UINT uFlags, SHSTOCKICONINFO *psii); hShellDLL = ::LoadLibraryW(L"shell32.dll"); if(hShellDLL == NULL) return false; (*(FARPROC*)&pfnSHGetStockIconInfo) = ::GetProcAddress(hShellDLL, "SHGetStockIconInfo"); if(pfnSHGetStockIconInfo) { SHSTOCKICONINFO stockInfo; stockInfo.cbSize = sizeof(SHSTOCKICONINFO); hr = pfnSHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_SMALLICON, &stockInfo); if(hr == S_OK) { wxIcon uacShieldIcon; #if wxCHECK_VERSION(2, 9, 0) uacShieldIcon.CreateFromHICON(stockInfo.hIcon); #endif shieldBM.CopyFromIcon(uacShieldIcon); ::DestroyIcon(stockInfo.hIcon); } else isOK = false; } else isOK = false; ::FreeLibrary(hShellDLL); return isOK; }