xref: /AOO41X/main/setup_native/source/win32/customactions/shellextensions/iconcache.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifdef _MSC_VER
25 #pragma warning(push, 1) /* disable warnings within system headers */
26 #endif
27 #define WIN32_LEAN_AND_MEAN
28 #include <windows.h>
29 #include <msiquery.h>
30 #ifdef _MSC_VER
31 #pragma warning(pop)
32 #endif
33 
34 #include <stdlib.h>
35 
RebuildShellIconCache(MSIHANDLE)36 extern "C" UINT __stdcall RebuildShellIconCache(MSIHANDLE)
37 {
38     // Rebuild icon cache on windows OS prior XP
39 
40     OSVERSIONINFO   osverinfo;
41 
42     osverinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
43 
44     if (
45         GetVersionEx( &osverinfo ) &&
46         VER_PLATFORM_WIN32_NT == osverinfo.dwPlatformId &&
47         (
48         5 < osverinfo.dwMajorVersion ||
49         5 == osverinfo.dwMajorVersion && 0 < osverinfo.dwMinorVersion
50         )
51         )
52     {
53         return ERROR_SUCCESS;
54     }
55 
56     HKEY    hKey;
57     DWORD   dwDispostion;
58     LONG    lError = RegCreateKeyEx( HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop\\WindowMetrics"), 0, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE | KEY_QUERY_VALUE, NULL, &hKey, &dwDispostion );
59 
60     if ( ERROR_SUCCESS == lError )
61     {
62         TCHAR   szValue[256];
63         TCHAR   szTempValue[256];
64         DWORD   cbValue = sizeof(szValue);
65         DWORD   dwType;
66         int     iSize = 0;
67 
68         lError = RegQueryValueEx( hKey, TEXT("Shell Icon Size"), 0, &dwType, (LPBYTE)szValue, &cbValue );
69 
70         if ( ERROR_SUCCESS == lError )
71             iSize = atoi( szValue );
72 
73         if ( !iSize )
74         {
75             iSize = GetSystemMetrics( SM_CXICON );
76             itoa( iSize, szValue, 10 );
77             cbValue = strlen( szValue ) + 1;
78             dwType = REG_SZ;
79         }
80 
81         itoa( iSize + 1, szTempValue, 10 );
82         lError = RegSetValueEx( hKey, TEXT("Shell Icon Size"), 0, dwType, (LPBYTE)szTempValue, strlen( szTempValue ) + 1 );
83 
84         LRESULT lResult = SendMessageTimeout(
85              HWND_BROADCAST,
86              WM_SETTINGCHANGE,
87              SPI_SETNONCLIENTMETRICS,
88              (LPARAM)TEXT("WindowMetrics"),
89              SMTO_NORMAL|SMTO_ABORTIFHUNG,
90              0, NULL);
91 
92         lError = RegSetValueEx( hKey, TEXT("Shell Icon Size"), 0, dwType, (LPBYTE)szValue, cbValue );
93 
94         lResult = SendMessageTimeout(
95              HWND_BROADCAST,
96              WM_SETTINGCHANGE,
97              SPI_SETNONCLIENTMETRICS,
98              (LPARAM)TEXT("WindowMetrics"),
99              SMTO_NORMAL|SMTO_ABORTIFHUNG,
100              0, NULL);
101 
102         lError = RegCloseKey( hKey );
103     }
104 
105     return ERROR_SUCCESS;
106 }
107