1 #include <windows.h>
2 #include <setupapi.h>
3 #include <tchar.h>
4 #include <stdlib.h>
5 #include "resource.h"
6 
7 typedef BOOL (WINAPI * SH_GIL_PROC)(HIMAGELIST *phLarge, HIMAGELIST *phSmall);
8 typedef BOOL (WINAPI * FII_PROC)(BOOL fFullInit);
9 
10 /*** Shell32 undoc'd functions ***/
11   /* Shell_GetImageLists  @71  */
12   /* FileIconInit         @660 */
13 
14 BOOL
15 DisplayImageList(HWND hwnd,
16                  UINT uID)
17 {
18     HWND hLV;
19     SP_CLASSIMAGELIST_DATA ImageListData;
20     LV_ITEM lvItem;
21     TCHAR Buf[6];
22     INT ImageListCount = -1;
23     INT i = 0;
24 
25     hLV = GetDlgItem(hwnd, IDC_LSTVIEW);
26     (void)ListView_DeleteAllItems(hLV);
27 
28     if (uID == IDC_SYSTEM)
29     {
30         HIMAGELIST hLarge, hSmall;
31         HMODULE      hShell32;
32         SH_GIL_PROC  Shell_GetImageLists;
33         FII_PROC     FileIconInit;
34 
35         hShell32 = LoadLibrary(_T("shell32.dll"));
36         if(hShell32 == NULL)
37             return FALSE;
38 
39         Shell_GetImageLists = (SH_GIL_PROC)GetProcAddress(hShell32, (LPCSTR)71);
40         FileIconInit = (FII_PROC)GetProcAddress(hShell32, (LPCSTR)660);
41 
42         if(Shell_GetImageLists == NULL || FileIconInit == NULL)
43         {
44             FreeLibrary(hShell32);
45             return FALSE;
46         }
47 
48         FileIconInit(TRUE);
49 
50         Shell_GetImageLists(&hLarge, &hSmall);
51 
52         ImageListCount = ImageList_GetImageCount(hSmall);
53 
54         (void)ListView_SetImageList(hLV,
55                                     hSmall,
56                                     LVSIL_SMALL);
57 
58         FreeLibrary(hShell32);
59     }
60     else if (uID == IDC_DEVICE)
61     {
62         ImageListData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
63         SetupDiGetClassImageList(&ImageListData);
64 
65         ImageListCount = ImageList_GetImageCount(ImageListData.ImageList);
66 
67         (void)ListView_SetImageList(hLV,
68                                     ImageListData.ImageList,
69                                     LVSIL_SMALL);
70     }
71     else
72         return FALSE;
73 
74     lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
75 
76     while (i <= ImageListCount)
77     {
78         lvItem.iItem = i;
79         lvItem.iSubItem = 0;
80         lvItem.pszText = _itot(i, Buf, 10);
81         lvItem.iImage = i;
82 
83         (void)ListView_InsertItem(hLV, &lvItem);
84 
85         i++;
86     }
87 
88     return TRUE;
89 }
90 
91 
92 BOOL CALLBACK
93 DlgProc(HWND hwnd,
94         UINT message,
95         WPARAM wParam,
96         LPARAM lParam)
97 {
98     switch (message)
99     {
100         case WM_INITDIALOG:
101             DisplayImageList(hwnd, IDC_SYSTEM);
102             return TRUE;
103 
104         case WM_CLOSE:
105             EndDialog(hwnd, 0);
106             return TRUE;
107 
108         case WM_COMMAND:
109         {
110             switch(LOWORD(wParam))
111             {
112                 case IDOK:
113                     EndDialog(hwnd, 0);
114                     return TRUE;
115 
116                 case IDC_SYSTEM:
117                     DisplayImageList(hwnd, IDC_SYSTEM);
118                     return TRUE;
119 
120                 case IDC_DEVICE:
121                     DisplayImageList(hwnd, IDC_DEVICE);
122                     return TRUE;
123             }
124         }
125     }
126 
127     return FALSE;
128 }
129 
130 int WINAPI
131 WinMain(HINSTANCE hThisInstance,
132         HINSTANCE hPrevInstance,
133         LPSTR lpszArgument,
134         int nCmdShow)
135 {
136     INITCOMMONCONTROLSEX icex;
137 
138     icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
139     icex.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES;
140     InitCommonControlsEx(&icex);
141 
142     return DialogBox(hThisInstance,
143                      MAKEINTRESOURCE(IDD_IMGLST),
144                      NULL,
145                      (DLGPROC)DlgProc);
146 }
147