shell: Explicitly convert icons to 16-bit instead of casting handles.
This commit is contained in:
parent
5f27257e57
commit
03f7bbdbf7
|
@ -3,7 +3,7 @@ TOPOBJDIR = ../..
|
||||||
SRCDIR = @srcdir@
|
SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = shell.dll16
|
MODULE = shell.dll16
|
||||||
IMPORTS = shell32 user32 advapi32 kernel32 kernel
|
IMPORTS = shell32 user32 gdi32 advapi32 kernel32 kernel
|
||||||
|
|
||||||
EXTRADLLFLAGS = -Wb,--subsystem,win16,--main-module,shell32.dll
|
EXTRADLLFLAGS = -Wb,--subsystem,win16,--main-module,shell32.dll
|
||||||
EXTRARCFLAGS = -O res16
|
EXTRARCFLAGS = -O res16
|
||||||
|
|
|
@ -52,7 +52,6 @@ extern HINSTANCE WINAPI WOWShellExecute(HWND hWnd, LPCSTR lpOperation,LPCSTR lpF
|
||||||
LPCSTR lpParameters,LPCSTR lpDirectory,
|
LPCSTR lpParameters,LPCSTR lpDirectory,
|
||||||
INT iShowCmd, void *callback);
|
INT iShowCmd, void *callback);
|
||||||
|
|
||||||
#define HICON_16(h32) (LOWORD(h32))
|
|
||||||
#define HINSTANCE_32(h16) ((HINSTANCE)(ULONG_PTR)(h16))
|
#define HINSTANCE_32(h16) ((HINSTANCE)(ULONG_PTR)(h16))
|
||||||
#define HINSTANCE_16(h32) (LOWORD(h32))
|
#define HINSTANCE_16(h32) (LOWORD(h32))
|
||||||
|
|
||||||
|
@ -84,6 +83,50 @@ static HICON convert_icon_to_32( HICON16 icon16 )
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HICON16 convert_icon_to_16( HINSTANCE16 inst, HICON icon )
|
||||||
|
{
|
||||||
|
static HICON16 (WINAPI *pCreateIcon16)(HINSTANCE16,INT16,INT16,BYTE,BYTE,LPCVOID,LPCVOID);
|
||||||
|
ICONINFO info;
|
||||||
|
BITMAP bm;
|
||||||
|
UINT and_size, xor_size;
|
||||||
|
void *xor_bits = NULL, *and_bits;
|
||||||
|
HICON16 handle = 0;
|
||||||
|
|
||||||
|
if (!pCreateIcon16 &&
|
||||||
|
!(pCreateIcon16 = (void *)GetProcAddress( GetModuleHandleA("user.exe16"), "CreateIcon16" )))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!(GetIconInfo( icon, &info ))) return 0;
|
||||||
|
GetObjectW( info.hbmMask, sizeof(bm), &bm );
|
||||||
|
and_size = bm.bmHeight * bm.bmWidthBytes;
|
||||||
|
if (!(and_bits = HeapAlloc( GetProcessHeap(), 0, and_size ))) goto done;
|
||||||
|
GetBitmapBits( info.hbmMask, and_size, and_bits );
|
||||||
|
if (info.hbmColor)
|
||||||
|
{
|
||||||
|
GetObjectW( info.hbmColor, sizeof(bm), &bm );
|
||||||
|
xor_size = bm.bmHeight * bm.bmWidthBytes;
|
||||||
|
if (!(xor_bits = HeapAlloc( GetProcessHeap(), 0, xor_size ))) goto done;
|
||||||
|
GetBitmapBits( info.hbmColor, xor_size, xor_bits );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bm.bmHeight /= 2;
|
||||||
|
xor_bits = (char *)and_bits + and_size / 2;
|
||||||
|
}
|
||||||
|
handle = pCreateIcon16( inst, bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel,
|
||||||
|
and_bits, xor_bits );
|
||||||
|
done:
|
||||||
|
HeapFree( GetProcessHeap(), 0, and_bits );
|
||||||
|
if (info.hbmColor)
|
||||||
|
{
|
||||||
|
HeapFree( GetProcessHeap(), 0, xor_bits );
|
||||||
|
DeleteObject( info.hbmColor );
|
||||||
|
}
|
||||||
|
DeleteObject( info.hbmMask );
|
||||||
|
DestroyIcon( icon );
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DllEntryPoint [SHELL.101]
|
* DllEntryPoint [SHELL.101]
|
||||||
*
|
*
|
||||||
|
@ -239,7 +282,7 @@ HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance,
|
||||||
if ((ret != 0xffffffff) && ret)
|
if ((ret != 0xffffffff) && ret)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < n; i++) RetPtr[i] = HICON_16(icons[i]);
|
for (i = 0; i < n; i++) RetPtr[i] = convert_icon_to_16(hInstance, icons[i]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -257,19 +300,18 @@ HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance,
|
||||||
HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
|
HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
|
||||||
UINT16 nIconIndex )
|
UINT16 nIconIndex )
|
||||||
{ TRACE("\n");
|
{ TRACE("\n");
|
||||||
return HICON_16(ExtractIconA(HINSTANCE_32(hInstance), lpszExeFileName, nIconIndex));
|
return convert_icon_to_16( hInstance, ExtractIconA(NULL, lpszExeFileName, nIconIndex) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* ExtractIconEx (SHELL.40)
|
* ExtractIconEx (SHELL.40)
|
||||||
*/
|
*/
|
||||||
HICON16 WINAPI ExtractIconEx16(
|
UINT16 WINAPI ExtractIconEx16(
|
||||||
LPCSTR lpszFile, INT16 nIconIndex, HICON16 *phiconLarge,
|
LPCSTR lpszFile, INT16 nIconIndex, HICON16 *phiconLarge,
|
||||||
HICON16 *phiconSmall, UINT16 nIcons
|
HICON16 *phiconSmall, UINT16 nIcons
|
||||||
) {
|
) {
|
||||||
HICON *ilarge,*ismall;
|
HICON *ilarge,*ismall;
|
||||||
UINT16 ret;
|
int i, ret;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (phiconLarge)
|
if (phiconLarge)
|
||||||
ilarge = HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON));
|
ilarge = HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON));
|
||||||
|
@ -279,15 +321,15 @@ HICON16 WINAPI ExtractIconEx16(
|
||||||
ismall = HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON));
|
ismall = HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON));
|
||||||
else
|
else
|
||||||
ismall = NULL;
|
ismall = NULL;
|
||||||
ret = HICON_16(ExtractIconExA(lpszFile,nIconIndex,ilarge,ismall,nIcons));
|
ret = ExtractIconExA(lpszFile,nIconIndex,ilarge,ismall,nIcons);
|
||||||
if (ilarge) {
|
if (ilarge) {
|
||||||
for (i=0;i<nIcons;i++)
|
for (i=0;i<ret;i++)
|
||||||
phiconLarge[i]=HICON_16(ilarge[i]);
|
phiconLarge[i] = convert_icon_to_16(0, ilarge[i]);
|
||||||
HeapFree(GetProcessHeap(),0,ilarge);
|
HeapFree(GetProcessHeap(),0,ilarge);
|
||||||
}
|
}
|
||||||
if (ismall) {
|
if (ismall) {
|
||||||
for (i=0;i<nIcons;i++)
|
for (i=0;i<ret;i++)
|
||||||
phiconSmall[i]=HICON_16(ismall[i]);
|
phiconSmall[i] = convert_icon_to_16(0, ismall[i]);
|
||||||
HeapFree(GetProcessHeap(),0,ismall);
|
HeapFree(GetProcessHeap(),0,ismall);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -301,8 +343,7 @@ HICON16 WINAPI ExtractIconEx16(
|
||||||
*/
|
*/
|
||||||
HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst, LPSTR lpIconPath, LPWORD lpiIcon)
|
HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst, LPSTR lpIconPath, LPWORD lpiIcon)
|
||||||
{
|
{
|
||||||
return HICON_16(ExtractAssociatedIconA(HINSTANCE_32(hInst), lpIconPath,
|
return convert_icon_to_16( hInst, ExtractAssociatedIconA(NULL, lpIconPath, lpiIcon) );
|
||||||
lpiIcon));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue