Example #1
0
/**
 * 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;
}