ReactOS 0.4.15-dev-7788-g1ad9096
filetypes.cpp
Go to the documentation of this file.
1/*
2 * 'File Types' tab property sheet of Folder Options
3 *
4 * Copyright 2007 Johannes Anderwald <johannes.anderwald@reactos.org>
5 * Copyright 2016-2018 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "precomp.h"
23
25
26// DefaultIcon = %SystemRoot%\system32\SHELL32.dll,-210
27// Verbs: Open / RunAs
28// Cmd: rundll32.exe shell32.dll,Options_RunDLL 0
29
31
32typedef struct FILE_TYPE_ENTRY
33{
46
47static BOOL
48DeleteExt(HWND hwndDlg, LPCWSTR pszExt)
49{
50 if (*pszExt != L'.')
51 return FALSE;
52
53 // open ".ext" key
54 HKEY hKey;
56 return FALSE;
57
58 // query "extfile" key name
59 WCHAR szValue[64] = { 0 };
60 DWORD cbValue = sizeof(szValue);
61 RegQueryValueExW(hKey, NULL, NULL, NULL, LPBYTE(szValue), &cbValue);
63
64 // delete "extfile" key (if any)
65 if (szValue[0])
67
68 // delete ".ext" key
70}
71
72static inline HICON
74 INT iIndex = 0, BOOL bSmall = FALSE)
75{
77
78 if (iIndex < 0)
79 {
80 // A negative value will be interpreted as a negated resource ID.
81 iIndex = -iIndex;
82
83 INT cx, cy;
85 if (bSmall)
86 {
89 }
90 else
91 {
94 }
96 cx, cy, 0));
97 FreeLibrary(hDLL);
98 }
99 else
100 {
101 // A positive value is icon index.
102 if (bSmall)
103 ExtractIconExW(IconPath, iIndex, NULL, &hIcon, 1);
104 else
105 ExtractIconExW(IconPath, iIndex, &hIcon, NULL, 1);
106 }
107 return hIcon;
108}
109
110static void
112{
113 // Expand the REG_EXPAND_SZ string by environment variables
114 WCHAR szLocation[MAX_PATH + 32];
115 if (!ExpandEnvironmentStringsW(IconLocation, szLocation, _countof(szLocation)))
116 return;
117
118 Entry->nIconIndex = PathParseIconLocationW(szLocation);
119 StringCbCopyW(Entry->IconPath, sizeof(Entry->IconPath), szLocation);
120 Entry->hIconLarge = DoExtractIcon(Entry, szLocation, Entry->nIconIndex, FALSE);
121 Entry->hIconSmall = DoExtractIcon(Entry, szLocation, Entry->nIconIndex, TRUE);
122}
123
124static BOOL
126{
127 Entry->hIconLarge = Entry->hIconSmall = NULL;
128
129 if (lstrcmpiW(Entry->FileExtension, L".exe") == 0 ||
130 lstrcmpiW(Entry->FileExtension, L".scr") == 0)
131 {
132 // It's an executable
137 IMAGE_ICON, cx, cy, 0));
138 StringCbCopyW(Entry->IconPath, sizeof(Entry->IconPath), g_pszShell32);
139 Entry->nIconIndex = -IDI_SHELL_EXE;
140 }
141 else if (lstrcmpW(IconLocation, L"%1") == 0)
142 {
143 return FALSE; // self icon
144 }
145 else
146 {
148 }
149
150 return Entry->hIconLarge && Entry->hIconSmall;
151}
152
153static BOOL
155{
156 Entry->hIconLarge = Entry->hIconSmall = NULL;
157
158 // Open the "DefaultIcon" registry key
159 HKEY hDefIconKey;
160 LONG nResult = RegOpenKeyExW(hKey, L"DefaultIcon", 0, KEY_READ, &hDefIconKey);
161 if (nResult != ERROR_SUCCESS)
162 return FALSE;
163
164 // Get the icon location
165 WCHAR szLocation[MAX_PATH + 32] = { 0 };
166 DWORD dwSize = sizeof(szLocation);
167 nResult = RegQueryValueExW(hDefIconKey, NULL, NULL, NULL, LPBYTE(szLocation), &dwSize);
168
169 RegCloseKey(hDefIconKey);
170
171 if (nResult != ERROR_SUCCESS || szLocation[0] == 0)
172 return FALSE;
173
174 return GetFileTypeIconsEx(Entry, szLocation);
175}
176
177static BOOL
179{
180 SHFILEINFOW FileInfo = { 0 };
181 if (SHGetFileInfoW(ProgramPath, 0, &FileInfo, sizeof(FileInfo), SHGFI_DISPLAYNAME))
182 {
183 StringCchCopyW(pszName, cchName, FileInfo.szDisplayName);
184 return TRUE;
185 }
186
187 return !!GetFileTitleW(ProgramPath, pszName, cchName);
188}
189
190static void
192{
197 IMAGE_ICON, cxSmall, cySmall, 0));
198 StringCbCopyW(Entry->IconPath, sizeof(Entry->IconPath), g_pszShell32);
199 Entry->nIconIndex = -IDI_SHELL_FOLDER_OPTIONS;
200}
201
203// EditTypeDlg
204
205#define LISTBOX_MARGIN 2
206
207typedef struct EDITTYPE_DIALOG
208{
211 CSimpleMap<CStringW, CStringW> CommandLineMap;
216
217static void
219{
222
224 IconIndex = pEditType->nIconIndex;
225 if (PickIconDlg(hwndDlg, szPath, _countof(szPath), &IconIndex))
226 {
227 // replace Windows directory with "%SystemRoot%" (for portability)
228 WCHAR szWinDir[MAX_PATH];
229 GetWindowsDirectoryW(szWinDir, _countof(szWinDir));
230 if (wcsstr(szPath, szWinDir) == 0)
231 {
232 CStringW str(L"%SystemRoot%");
233 str += &szPath[wcslen(szWinDir)];
235 }
236
237 // update FILE_TYPE_ENTRY
238 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
239 DestroyIcon(pEntry->hIconLarge);
240 DestroyIcon(pEntry->hIconSmall);
243
244 // update EDITTYPE_DIALOG
245 StringCbCopyW(pEditType->szIconPath, sizeof(pEditType->szIconPath), szPath);
246 pEditType->nIconIndex = IconIndex;
247
248 // set icon to dialog
250 }
251}
252
253static BOOL
255{
256 WCHAR szText[64];
257 HFONT hFont, hFont2;
258
259 if (!pDraw)
260 return FALSE;
261
262 // fill rect and set colors
263 if (pDraw->itemState & ODS_SELECTED)
264 {
265 FillRect(pDraw->hDC, &pDraw->rcItem, HBRUSH(COLOR_HIGHLIGHT + 1));
268 }
269 else
270 {
271 FillRect(pDraw->hDC, &pDraw->rcItem, HBRUSH(COLOR_WINDOW + 1));
274 }
275
276 // get listbox text
277 HWND hwndListBox = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
278 SendMessageW(hwndListBox, LB_GETTEXT, pDraw->itemID, (LPARAM)szText);
279
280 // is it default?
281 hFont = (HFONT)SendMessageW(hwndListBox, WM_GETFONT, 0, 0);
282 if (lstrcmpiW(pEditType->szDefaultVerb, szText) == 0)
283 {
284 // default. set bold
285 LOGFONTW lf;
286 GetObject(hFont, sizeof(lf), &lf);
287 lf.lfWeight = FW_BOLD;
288 hFont2 = CreateFontIndirectW(&lf);
289 if (hFont2)
290 {
291 HGDIOBJ hFontOld = SelectObject(pDraw->hDC, hFont2);
293 DrawTextW(pDraw->hDC, szText, -1, &pDraw->rcItem,
296 SelectObject(pDraw->hDC, hFontOld);
297 DeleteObject(hFont2);
298 }
299 }
300 else
301 {
302 // non-default
304 DrawTextW(pDraw->hDC, szText, -1, &pDraw->rcItem,
307 }
308
309 // draw focus rect
310 if (pDraw->itemState & ODS_FOCUS)
311 {
312 DrawFocusRect(pDraw->hDC, &pDraw->rcItem);
313 }
314 return TRUE;
315}
316
317static BOOL
319{
320 if (!pMeasure)
321 return FALSE;
322
323 HWND hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
324
325 HDC hDC = GetDC(hwndLB);
326 if (hDC)
327 {
330 pMeasure->itemHeight = tm.tmHeight + LISTBOX_MARGIN * 2;
331 ReleaseDC(hwndLB, hDC);
332 return TRUE;
333 }
334 return FALSE;
335}
336
338// NewExtDlg
339
340typedef struct NEWEXT_DIALOG
341{
349
350static VOID
352{
353 // If "Advanced" button was clicked, then we shrink or expand the dialog.
354 RECT rc, rc1, rc2;
355
356 GetWindowRect(hwndDlg, &rc);
357 rc.bottom = rc.top + (pNewExt->rcDlg.bottom - pNewExt->rcDlg.top);
358
359 GetWindowRect(GetDlgItem(hwndDlg, IDOK), &rc1);
360 MapWindowPoints(NULL, hwndDlg, (LPPOINT)&rc1, 2);
361
363 MapWindowPoints(NULL, hwndDlg, (LPPOINT)&rc2, 2);
364
365 if (pNewExt->bAdvanced)
366 {
367 rc1.top += pNewExt->dy;
368 rc1.bottom += pNewExt->dy;
369
370 rc2.top += pNewExt->dy;
371 rc2.bottom += pNewExt->dy;
372
375
377 SetDlgItemTextW(hwndDlg, IDC_NEWEXT_ADVANCED, strLeft);
378
380 }
381 else
382 {
383 rc1.top -= pNewExt->dy;
384 rc1.bottom -= pNewExt->dy;
385
386 rc2.top -= pNewExt->dy;
387 rc2.bottom -= pNewExt->dy;
388
391
393 SetDlgItemTextW(hwndDlg, IDC_NEWEXT_ADVANCED, strRight);
394
395 rc.bottom -= pNewExt->dy;
396
397 CStringW strText(MAKEINTRESOURCEW(IDS_NEWEXT_NEW));
398 SetDlgItemTextW(hwndDlg, IDC_NEWEXT_COMBOBOX, strText);
399 }
400
401 HDWP hDWP = BeginDeferWindowPos(3);
402
403 if (hDWP)
404 hDWP = DeferWindowPos(hDWP, GetDlgItem(hwndDlg, IDOK), NULL,
405 rc1.left, rc1.top, rc1.right - rc1.left, rc1.bottom - rc1.top,
407 if (hDWP)
408 hDWP = DeferWindowPos(hDWP, GetDlgItem(hwndDlg, IDCANCEL), NULL,
409 rc2.left, rc2.top, rc2.right - rc2.left, rc2.bottom - rc2.top,
411 if (hDWP)
412 hDWP = DeferWindowPos(hDWP, hwndDlg, NULL,
413 rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
415
416 if (hDWP)
417 EndDeferWindowPos(hDWP);
418}
419
420static BOOL
422{
423 pNewExt->bAdvanced = FALSE;
424
425 // get window rectangle
426 GetWindowRect(hwndDlg, &pNewExt->rcDlg);
427
428 // get delta Y
429 RECT rc1, rc2;
432 pNewExt->dy = rc2.top - rc1.top;
433
434 // initialize
435 CStringW strText(MAKEINTRESOURCEW(IDS_NEWEXT_NEW));
439
440 // shrink it first time
441 NewExtDlg_OnAdvanced(hwndDlg, pNewExt);
442
443 return TRUE;
444}
445
446static BOOL
448{
450 INT iItem;
451
452 GetDlgItemTextW(hwndDlg, IDC_NEWEXT_EDIT, pNewExt->szExt, _countof(pNewExt->szExt));
453 StrTrimW(pNewExt->szExt, g_pszSpace);
454 _wcsupr(pNewExt->szExt);
455
457 StrTrimW(pNewExt->szFileType, g_pszSpace);
458
459 if (pNewExt->szExt[0] == 0)
460 {
461 CStringW strText(MAKEINTRESOURCEW(IDS_NEWEXT_SPECIFY_EXT));
462 CStringW strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
463 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
464 return FALSE;
465 }
466
467 ZeroMemory(&find, sizeof(find));
468 find.flags = LVFI_STRING;
469 if (pNewExt->szExt[0] == L'.')
470 {
471 find.psz = &pNewExt->szExt[1];
472 }
473 else
474 {
475 find.psz = pNewExt->szExt;
476 }
477
478 iItem = ListView_FindItem(pNewExt->hwndLV, -1, &find);
479 if (iItem >= 0)
480 {
481 // already exists
482
483 // get file type
484 WCHAR szFileType[64];
486 ZeroMemory(&item, sizeof(item));
487 item.mask = LVIF_TEXT;
488 item.pszText = szFileType;
489 item.cchTextMax = _countof(szFileType);
490 item.iItem = iItem;
491 item.iSubItem = 1;
492 ListView_GetItem(pNewExt->hwndLV, &item);
493
494 // get text
495 CStringW strText;
496 strText.Format(IDS_NEWEXT_ALREADY_ASSOC, find.psz, szFileType, find.psz, szFileType);
497
498 // get title
499 CStringW strTitle;
501
502 if (MessageBoxW(hwndDlg, strText, strTitle, MB_ICONWARNING | MB_YESNO) == IDNO)
503 {
504 return FALSE;
505 }
506
507 // Delete the extension
508 CStringW strExt(L".");
509 strExt += find.psz;
510 strExt.MakeLower();
511 DeleteExt(hwndDlg, strExt);
512
513 // Delete the item
514 ListView_DeleteItem(pNewExt->hwndLV, iItem);
515 }
516
517 EndDialog(hwndDlg, IDOK);
518 return TRUE;
519}
520
521// IDD_NEWEXTENSION
522static INT_PTR CALLBACK
524 HWND hwndDlg,
525 UINT uMsg,
528{
529 static PNEWEXT_DIALOG s_pNewExt = NULL;
530
531 switch (uMsg)
532 {
533 case WM_INITDIALOG:
534 s_pNewExt = (PNEWEXT_DIALOG)lParam;
535 NewExtDlg_OnInitDialog(hwndDlg, s_pNewExt);
536 return TRUE;
537
538 case WM_COMMAND:
539 switch (LOWORD(wParam))
540 {
541 case IDOK:
542 NewExtDlg_OnOK(hwndDlg, s_pNewExt);
543 break;
544
545 case IDCANCEL:
546 EndDialog(hwndDlg, IDCANCEL);
547 break;
548
550 s_pNewExt->bAdvanced = !s_pNewExt->bAdvanced;
551 NewExtDlg_OnAdvanced(hwndDlg, s_pNewExt);
552 break;
553 }
554 break;
555 }
556 return 0;
557}
558
559static BOOL
561{
563 HKEY hKey;
564 LVITEMW lvItem;
566 DWORD dwType;
567
568 if (szName[0] != L'.')
569 {
570 // FIXME handle URL protocol handlers
571 return FALSE;
572 }
573
574 // get imagelists of listview
575 HIMAGELIST himlLarge = ListView_GetImageList(hListView, LVSIL_NORMAL);
576 HIMAGELIST himlSmall = ListView_GetImageList(hListView, LVSIL_SMALL);
577
578 // allocate file type entry
580 if (!Entry)
581 return FALSE;
582
583 // open key
585 {
587 return FALSE;
588 }
589
590 // FIXME check for duplicates
591
592 // query for the default key
593 dwSize = sizeof(Entry->ClassKey);
595 {
596 // no link available
597 Entry->ClassKey[0] = 0;
598 }
599
600 Entry->ClassName[0] = 0;
601 if (Entry->ClassKey[0])
602 {
603 HKEY hTemp;
604 // try open linked key
605 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, Entry->ClassKey, 0, KEY_READ, &hTemp) == ERROR_SUCCESS)
606 {
607 DWORD dwSize = sizeof(Entry->ClassName);
608 RegQueryValueExW(hTemp, NULL, NULL, NULL, LPBYTE(Entry->ClassName), &dwSize);
609
610 // use linked key
612 hKey = hTemp;
613 }
614 }
615
616 // read friendly type name
617 if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", Entry->FileDescription,
618 sizeof(Entry->FileDescription), NULL, 0, NULL) != ERROR_SUCCESS)
619 {
620 // read file description
621 dwSize = sizeof(Entry->FileDescription);
622 Entry->FileDescription[0] = 0;
623
624 // read default key
625 RegQueryValueExW(hKey, NULL, NULL, NULL, LPBYTE(Entry->FileDescription), &dwSize);
626 }
627
628 // Read the EditFlags value
629 Entry->EditFlags = 0;
630 if (!RegQueryValueExW(hKey, L"EditFlags", NULL, &dwType, NULL, &dwSize))
631 {
632 if ((dwType == REG_DWORD || dwType == REG_BINARY) && dwSize == sizeof(DWORD))
633 RegQueryValueExW(hKey, L"EditFlags", NULL, NULL, (LPBYTE)&Entry->EditFlags, &dwSize);
634 }
635
636 // convert extension to upper case
637 wcscpy(Entry->FileExtension, szName);
638 _wcsupr(Entry->FileExtension);
639
640 // get icon
642 {
643 // set default icon
645 }
646
647 // close key
649
650 // get program path and app name
651 DWORD cch = _countof(Entry->ProgramPath);
653 Entry->FileExtension, NULL, Entry->ProgramPath, &cch))
654 {
655 QueryFileDescription(Entry->ProgramPath, Entry->AppName, _countof(Entry->AppName));
656 }
657 else
658 {
659 Entry->ProgramPath[0] = Entry->AppName[0] = 0;
660 }
661
662 // add icon to imagelist
663 INT iLargeImage = -1, iSmallImage = -1;
664 if (Entry->hIconLarge && Entry->hIconSmall)
665 {
666 iLargeImage = ImageList_AddIcon(himlLarge, Entry->hIconLarge);
667 iSmallImage = ImageList_AddIcon(himlSmall, Entry->hIconSmall);
668 ASSERT(iLargeImage == iSmallImage);
670 }
671
672 // Do not add excluded entries
673 if (Entry->EditFlags & 0x00000001) //FTA_Exclude
674 {
675 DestroyIcon(Entry->hIconLarge);
676 DestroyIcon(Entry->hIconSmall);
678 return FALSE;
679 }
680
681 if (!Entry->FileDescription[0])
682 {
683 // construct default 'FileExtensionFile' by formatting the uppercase extension
684 // with IDS_FILE_EXT_TYPE, outputting something like a l18n 'INI File'
685
686 StringCbPrintfW(Entry->FileDescription, sizeof(Entry->FileDescription),
687 szFile, &Entry->FileExtension[1]);
688 }
689
690 ZeroMemory(&lvItem, sizeof(LVITEMW));
691 lvItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
692 lvItem.iSubItem = 0;
693 lvItem.pszText = &Entry->FileExtension[1];
694 lvItem.iItem = iItem;
695 lvItem.lParam = (LPARAM)Entry;
696 lvItem.iImage = iSmallImage;
697 SendMessageW(hListView, LVM_INSERTITEMW, 0, (LPARAM)&lvItem);
698
699 ZeroMemory(&lvItem, sizeof(LVITEMW));
700 lvItem.mask = LVIF_TEXT;
701 lvItem.pszText = Entry->FileDescription;
702 lvItem.iItem = iItem;
703 lvItem.iSubItem = 1;
704 ListView_SetItem(hListView, &lvItem);
705
706 return TRUE;
707}
708
709static BOOL
710FileTypesDlg_AddExt(HWND hwndDlg, LPCWSTR pszExt, LPCWSTR pszFileType)
711{
712 DWORD dwValue = 1;
713 HKEY hKey;
714 WCHAR szKey[13]; // max. "ft4294967295" + "\0"
715 LONG nResult;
716
717 // Search the next "ft%06u" key name
718 do
719 {
720 StringCbPrintfW(szKey, sizeof(szKey), L"ft%06u", dwValue);
721
722 nResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hKey);
723 if (nResult != ERROR_SUCCESS)
724 break;
725
727 ++dwValue;
728 } while (dwValue != 0);
729
731
732 if (dwValue == 0)
733 return FALSE;
734
735 // Create new "ft%06u" key
736 nResult = RegCreateKeyEx(HKEY_CLASSES_ROOT, szKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL);
737 if (ERROR_SUCCESS != nResult)
738 return FALSE;
739
741
742 // Create the ".ext" key
743 WCHAR szExt[16];
744 if (*pszExt == L'.')
745 ++pszExt;
746 StringCbPrintfW(szExt, sizeof(szExt), L".%s", pszExt);
747 _wcslwr(szExt);
748 nResult = RegCreateKeyEx(HKEY_CLASSES_ROOT, szExt, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL);
749 _wcsupr(szExt);
750 if (ERROR_SUCCESS != nResult)
751 return FALSE;
752
753 // Set the default value of ".ext" to "ft%06u"
754 DWORD dwSize = (lstrlen(szKey) + 1) * sizeof(WCHAR);
756
758
759 // Make up the file type name
760 WCHAR szFile[100];
761 CStringW strFormat(MAKEINTRESOURCEW(IDS_FILE_EXT_TYPE));
762 StringCbPrintfW(szFile, sizeof(szFile), strFormat, &szExt[1]);
763
764 // Insert an item to the listview
765 HWND hListView = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
766 INT iItem = ListView_GetItemCount(hListView);
767 if (!FileTypesDlg_InsertToLV(hListView, szExt, iItem, szFile))
768 return FALSE;
769
771 ZeroMemory(&item, sizeof(item));
772 item.mask = LVIF_STATE | LVIF_TEXT;
773 item.iItem = iItem;
775 item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
776 item.pszText = &szExt[1];
777 ListView_SetItem(hListView, &item);
778
779 item.pszText = szFile;
780 item.iSubItem = 1;
781 ListView_SetItem(hListView, &item);
782
783 ListView_EnsureVisible(hListView, iItem, FALSE);
784
785 return TRUE;
786}
787
788static BOOL
790{
791 HWND hListView = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
792
793 INT iItem = ListView_GetNextItem(hListView, -1, LVNI_SELECTED);
794 if (iItem == -1)
795 return FALSE;
796
797 WCHAR szExt[20];
798 szExt[0] = L'.';
799 ListView_GetItemText(hListView, iItem, 0, &szExt[1], _countof(szExt) - 1);
800 _wcslwr(szExt);
801
802 DeleteExt(hwndDlg, szExt);
803 ListView_DeleteItem(hListView, iItem);
804 return TRUE;
805}
806
808// common code of NewActionDlg and EditActionDlg
809
810typedef struct ACTION_DIALOG
811{
818
819static void
821{
822 WCHAR szFile[MAX_PATH];
823 szFile[0] = 0;
824
827
828 CStringW strTitle(MAKEINTRESOURCEW(IDS_OPEN_WITH));
829
831 ZeroMemory(&ofn, sizeof(ofn));
833 ofn.hwndOwner = hwndDlg;
835 ofn.lpstrFile = szFile;
836 ofn.nMaxFile = _countof(szFile);
837 ofn.lpstrTitle = strTitle;
839 ofn.lpstrDefExt = L"exe";
840 if (GetOpenFileNameW(&ofn))
841 {
842 if (bEdit)
843 {
844 CStringW str = szFile;
845 str += L" \"%1\"";
847 }
848 else
849 {
850 SetDlgItemTextW(hwndDlg, IDC_ACTION_APP, szFile);
851 }
852 }
853}
854
856// NewActionDlg
857
858static void
860{
861 // check action
862 GetDlgItemTextW(hwndDlg, IDC_ACTION_ACTION, pNewAct->szAction, _countof(pNewAct->szAction));
863 StrTrimW(pNewAct->szAction, g_pszSpace);
864 if (pNewAct->szAction[0] == 0)
865 {
866 // action was empty, error
867 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_ACTION);
868 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
869 SetFocus(hwndCtrl);
870 CStringW strText(MAKEINTRESOURCEW(IDS_SPECIFY_ACTION));
871 CStringW strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
872 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
873 return;
874 }
875
876 // check app
877 GetDlgItemTextW(hwndDlg, IDC_ACTION_APP, pNewAct->szApp, _countof(pNewAct->szApp));
878 StrTrimW(pNewAct->szApp, g_pszSpace);
879 if (pNewAct->szApp[0] == 0 ||
881 {
882 // app was empty or invalid
883 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_APP);
884 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
885 SetFocus(hwndCtrl);
886 CStringW strText(MAKEINTRESOURCEW(IDS_INVALID_PROGRAM));
887 CStringW strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
888 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
889 return;
890 }
891
892 EndDialog(hwndDlg, IDOK);
893}
894
895// IDD_ACTION
896static INT_PTR CALLBACK
898{
899 static PACTION_DIALOG s_pNewAct = NULL;
900
901 switch (uMsg)
902 {
903 case WM_INITDIALOG:
904 s_pNewAct = (PACTION_DIALOG)lParam;
905 s_pNewAct->bUseDDE = FALSE;
907 return TRUE;
908
909 case WM_COMMAND:
910 switch (LOWORD(wParam))
911 {
912 case IDOK:
913 NewActionDlg_OnOK(hwndDlg, s_pNewAct);
914 break;
915
916 case IDCANCEL:
917 EndDialog(hwndDlg, IDCANCEL);
918 break;
919
921 ActionDlg_OnBrowse(hwndDlg, s_pNewAct, FALSE);
922 break;
923 }
924 break;
925 }
926 return 0;
927}
928
930// EditActionDlg
931
932static void
934{
935 // check action
936 GetDlgItemTextW(hwndDlg, IDC_ACTION_ACTION, pEditAct->szAction, _countof(pEditAct->szAction));
937 StrTrimW(pEditAct->szAction, g_pszSpace);
938 if (pEditAct->szAction[0] == 0)
939 {
940 // action was empty. show error
941 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_ACTION);
942 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
943 SetFocus(hwndCtrl);
944 CStringW strText(MAKEINTRESOURCEW(IDS_SPECIFY_ACTION));
945 CStringW strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
946 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
947 }
948
949 // check app
950 GetDlgItemTextW(hwndDlg, IDC_ACTION_APP, pEditAct->szApp, _countof(pEditAct->szApp));
951 StrTrimW(pEditAct->szApp, g_pszSpace);
952 if (pEditAct->szApp[0] == 0)
953 {
954 // app was empty. show error
955 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_APP);
956 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
957 SetFocus(hwndCtrl);
958 CStringW strText(MAKEINTRESOURCEW(IDS_INVALID_PROGRAM));
959 CStringW strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
960 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
961 }
962
963 EndDialog(hwndDlg, IDOK);
964}
965
966// IDD_ACTION
967static INT_PTR CALLBACK
969{
970 static PACTION_DIALOG s_pEditAct = NULL;
971
972 switch (uMsg)
973 {
974 case WM_INITDIALOG:
975 s_pEditAct = (PACTION_DIALOG)lParam;
976 s_pEditAct->bUseDDE = FALSE;
977 SetDlgItemTextW(hwndDlg, IDC_ACTION_ACTION, s_pEditAct->szAction);
978 SetDlgItemTextW(hwndDlg, IDC_ACTION_APP, s_pEditAct->szApp);
981 {
982 // set title
984 str += s_pEditAct->ClassName;
985 SetWindowTextW(hwndDlg, str);
986 }
987 return TRUE;
988
989 case WM_COMMAND:
990 switch (LOWORD(wParam))
991 {
992 case IDOK:
993 EditActionDlg_OnOK(hwndDlg, s_pEditAct);
994 break;
995
996 case IDCANCEL:
997 EndDialog(hwndDlg, IDCANCEL);
998 break;
999
1000 case IDC_ACTION_BROWSE:
1001 ActionDlg_OnBrowse(hwndDlg, s_pEditAct, TRUE);
1002 break;
1003 }
1004 break;
1005 }
1006 return 0;
1007}
1008
1010// EditTypeDlg
1011
1012static BOOL
1015{
1016 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
1017
1018 BOOL bIconSet = FALSE;
1019 if (IconPath && IconPath[0])
1020 {
1021 DestroyIcon(pEntry->hIconLarge);
1022 DestroyIcon(pEntry->hIconSmall);
1025
1026 bIconSet = (pEntry->hIconLarge && pEntry->hIconSmall);
1027 }
1028 if (bIconSet)
1029 {
1030 StringCbCopyW(pEntry->IconPath, sizeof(pEntry->IconPath), IconPath);
1031 pEntry->nIconIndex = IconIndex;
1032 }
1033 else
1034 {
1036 }
1037
1038 HWND hListView = pEditType->hwndLV;
1039 HIMAGELIST himlLarge = ListView_GetImageList(hListView, LVSIL_NORMAL);
1040 HIMAGELIST himlSmall = ListView_GetImageList(hListView, LVSIL_SMALL);
1041
1042 INT iLargeImage = ImageList_AddIcon(himlLarge, pEntry->hIconLarge);
1043 INT iSmallImage = ImageList_AddIcon(himlSmall, pEntry->hIconSmall);
1044 ASSERT(iLargeImage == iSmallImage);
1046
1047 INT iItem = ListView_GetNextItem(hListView, -1, LVNI_SELECTED);
1048 if (iItem != -1)
1049 {
1050 LV_ITEMW Item = { LVIF_IMAGE, iItem };
1051 Item.iImage = iSmallImage;
1052 ListView_SetItem(hListView, &Item);
1053 }
1054 return TRUE;
1055}
1056
1057static BOOL
1059 LPCWSTR ClassKey, LPCWSTR ClassName, INT cchName)
1060{
1061 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
1062
1063 if (ClassKey[0] == 0)
1064 return FALSE;
1065
1066 // create or open class key
1068 if (RegCreateKeyExW(HKEY_CLASSES_ROOT, ClassKey, 0, NULL, 0, KEY_WRITE, NULL,
1070 {
1071 return FALSE;
1072 }
1073
1074 // create "DefaultIcon" key
1075 if (pEntry->IconPath[0])
1076 {
1077 HKEY hDefaultIconKey;
1078 if (RegCreateKeyExW(hClassKey, L"DefaultIcon", 0, NULL, 0, KEY_WRITE, NULL,
1079 &hDefaultIconKey, NULL) == ERROR_SUCCESS)
1080 {
1081 WCHAR szText[MAX_PATH];
1082 StringCbPrintfW(szText, sizeof(szText), L"%s,%d",
1083 pEntry->IconPath, pEntry->nIconIndex);
1084
1085 // set icon location
1086 DWORD dwSize = (lstrlenW(szText) + 1) * sizeof(WCHAR);
1087 RegSetValueExW(hDefaultIconKey, NULL, 0, REG_EXPAND_SZ, LPBYTE(szText), dwSize);
1088
1089 RegCloseKey(hDefaultIconKey);
1090 }
1091 }
1092
1093 // create "shell" key
1094 HKEY hShellKey;
1095 if (RegCreateKeyExW(hClassKey, L"shell", 0, NULL, 0, KEY_WRITE, NULL,
1096 &hShellKey, NULL) != ERROR_SUCCESS)
1097 {
1099 return FALSE;
1100 }
1101
1102 // delete shell commands
1103 WCHAR szVerbName[64];
1104 DWORD dwIndex = 0;
1105 while (RegEnumKeyW(hShellKey, dwIndex, szVerbName, _countof(szVerbName)) == ERROR_SUCCESS)
1106 {
1107 if (pEditType->CommandLineMap.FindKey(szVerbName) == -1)
1108 {
1109 // doesn't exist in CommandLineMap, then delete it
1110 if (SHDeleteKeyW(hShellKey, szVerbName) == ERROR_SUCCESS)
1111 {
1112 --dwIndex;
1113 }
1114 }
1115 ++dwIndex;
1116 }
1117
1118 // set default action
1119 RegSetValueExW(hShellKey, NULL, 0, REG_SZ,
1120 LPBYTE(pEditType->szDefaultVerb), sizeof(pEditType->szDefaultVerb));
1121
1122 // write shell commands
1123 const INT nCount = pEditType->CommandLineMap.GetSize();
1124 for (INT i = 0; i < nCount; ++i)
1125 {
1126 CStringW& key = pEditType->CommandLineMap.GetKeyAt(i);
1127 CStringW& value = pEditType->CommandLineMap.GetValueAt(i);
1128
1129 // create verb key
1130 HKEY hVerbKey;
1131 if (RegCreateKeyExW(hShellKey, key, 0, NULL, 0, KEY_WRITE, NULL,
1132 &hVerbKey, NULL) == ERROR_SUCCESS)
1133 {
1134 // create command key
1135 HKEY hCommandKey;
1136 if (RegCreateKeyExW(hVerbKey, L"command", 0, NULL, 0, KEY_WRITE, NULL,
1137 &hCommandKey, NULL) == ERROR_SUCCESS)
1138 {
1139 // write the default value
1140 DWORD dwSize = (value.GetLength() + 1) * sizeof(WCHAR);
1142
1143 RegCloseKey(hCommandKey);
1144 }
1145
1146 RegCloseKey(hVerbKey);
1147 }
1148 }
1149
1150 // set class name to class key
1151 RegSetValueExW(hClassKey, NULL, 0, REG_SZ, LPBYTE(ClassName), cchName);
1152
1153 RegCloseKey(hShellKey);
1155
1156 return TRUE;
1157}
1158
1159static BOOL
1161{
1162 // open class key
1165 return FALSE;
1166
1167 // open "shell" key
1168 HKEY hShellKey;
1169 if (RegOpenKeyExW(hClassKey, L"shell", 0, KEY_READ, &hShellKey) != ERROR_SUCCESS)
1170 {
1172 return FALSE;
1173 }
1174
1175 WCHAR DefaultVerb[64];
1176 DWORD dwSize = sizeof(DefaultVerb);
1177 if (RegQueryValueExW(hShellKey, NULL, NULL, NULL,
1178 LPBYTE(DefaultVerb), &dwSize) == ERROR_SUCCESS)
1179 {
1180 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), DefaultVerb);
1181 }
1182 else
1183 {
1184 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), L"open");
1185 }
1186
1187 // enumerate shell verbs
1188 WCHAR szVerbName[64];
1189 DWORD dwIndex = 0;
1190 while (RegEnumKeyW(hShellKey, dwIndex, szVerbName, _countof(szVerbName)) == ERROR_SUCCESS)
1191 {
1192 // open verb key
1193 HKEY hVerbKey;
1194 LONG nResult = RegOpenKeyExW(hShellKey, szVerbName, 0, KEY_READ, &hVerbKey);
1195 if (nResult == ERROR_SUCCESS)
1196 {
1197 // open command key
1198 HKEY hCommandKey;
1199 nResult = RegOpenKeyExW(hVerbKey, L"command", 0, KEY_READ, &hCommandKey);
1200 if (nResult == ERROR_SUCCESS)
1201 {
1202 // get command line
1203 WCHAR szValue[MAX_PATH + 32];
1204 dwSize = sizeof(szValue);
1205 nResult = RegQueryValueExW(hCommandKey, NULL, NULL, NULL, LPBYTE(szValue), &dwSize);
1206 if (nResult == ERROR_SUCCESS)
1207 {
1208 pEditType->CommandLineMap.SetAt(szVerbName, szValue);
1209 }
1210
1211 RegCloseKey(hCommandKey);
1212 }
1213
1214 RegCloseKey(hVerbKey);
1215 }
1217 ++dwIndex;
1218 }
1219
1220 RegCloseKey(hShellKey);
1222
1223 return TRUE;
1224}
1225
1226static void
1228{
1229 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
1230
1231 // get class name
1232 GetDlgItemTextW(hwndDlg, IDC_EDITTYPE_TEXT, pEntry->ClassName, _countof(pEntry->ClassName));
1233 StrTrimW(pEntry->ClassName, g_pszSpace);
1234
1235 // update entry icon
1236 EditTypeDlg_UpdateEntryIcon(hwndDlg, pEditType, pEditType->szIconPath, pEditType->nIconIndex);
1237
1238 // write registry
1239 EditTypeDlg_WriteClass(hwndDlg, pEditType, pEntry->ClassKey, pEntry->ClassName,
1240 _countof(pEntry->ClassName));
1241
1242 // update the icon cache
1244
1245 EndDialog(hwndDlg, IDOK);
1246}
1247
1248static BOOL
1250{
1251 // get current selection
1253 if (iItem == LB_ERR)
1254 return FALSE;
1255
1256 // ask user for removal
1257 CStringW strText(MAKEINTRESOURCEW(IDS_REMOVE_ACTION));
1258 CStringW strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
1259 if (MessageBoxW(hwndDlg, strText, strTitle, MB_ICONINFORMATION | MB_YESNO) == IDNO)
1260 return FALSE;
1261
1262 // get text
1263 WCHAR szText[64];
1264 szText[0] = 0;
1265 SendDlgItemMessageW(hwndDlg, IDC_EDITTYPE_LISTBOX, LB_GETTEXT, iItem, (LPARAM)szText);
1266 StrTrimW(szText, g_pszSpace);
1267
1268 // remove it
1269 pEditType->CommandLineMap.Remove(szText);
1271 return TRUE;
1272}
1273
1274static void
1276{
1277 INT iItem, iIndex;
1279 switch (id)
1280 {
1281 case IDOK:
1282 EditTypeDlg_OnOK(hwndDlg, pEditType);
1283 break;
1284
1285 case IDCANCEL:
1286 EndDialog(hwndDlg, IDCANCEL);
1287 break;
1288
1290 EditTypeDlg_OnChangeIcon(hwndDlg, pEditType);
1291 break;
1292
1293 case IDC_EDITTYPE_NEW:
1294 action.bUseDDE = FALSE;
1295 action.hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
1296 StringCbPrintfW(action.ClassName, sizeof(action.ClassName), pEditType->pEntry->ClassName);
1297 // open 'New Action' dialog
1300 {
1301 if (SendMessageW(action.hwndLB, LB_FINDSTRING, -1, (LPARAM)action.szAction) != LB_ERR)
1302 {
1303 // already exists, error
1304 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_ACTION);
1305 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
1306 SetFocus(hwndCtrl);
1307
1308 CStringW strText, strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
1309 strText.Format(IDS_ACTION_EXISTS, action.szAction);
1310 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
1311 }
1312 else
1313 {
1314 // add it
1315 CStringW strCommandLine = action.szApp;
1316 strCommandLine += L" \"%1\"";
1317 pEditType->CommandLineMap.SetAt(action.szAction, strCommandLine);
1318 SendMessageW(action.hwndLB, LB_ADDSTRING, 0, LPARAM(action.szAction));
1319 if (SendMessageW(action.hwndLB, LB_GETCOUNT, 0, 0) == 1)
1320 {
1321 // set default
1322 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), action.szAction);
1323 InvalidateRect(action.hwndLB, NULL, TRUE);
1324 }
1325 }
1326 }
1327 break;
1328
1330 if (code == LBN_SELCHANGE)
1331 {
1332 action.hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
1333 INT iItem = SendMessageW(action.hwndLB, LB_GETCURSEL, 0, 0);
1334 SendMessageW(action.hwndLB, LB_GETTEXT, iItem, LPARAM(action.szAction));
1335 if (lstrcmpiW(action.szAction, pEditType->szDefaultVerb) == 0)
1336 {
1338 }
1339 else
1340 {
1342 }
1343 break;
1344 }
1345 else if (code != LBN_DBLCLK)
1346 {
1347 break;
1348 }
1349 // FALL THROUGH
1350
1352 action.bUseDDE = FALSE;
1353 action.hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
1354 StringCbPrintfW(action.ClassName, sizeof(action.ClassName), pEditType->pEntry->ClassName);
1355 iItem = SendMessageW(action.hwndLB, LB_GETCURSEL, 0, 0);
1356 if (iItem == LB_ERR)
1357 break;
1358
1359 // get action
1360 SendMessageW(action.hwndLB, LB_GETTEXT, iItem, LPARAM(action.szAction));
1361
1362 // get app
1363 {
1364 iIndex = pEditType->CommandLineMap.FindKey(action.szAction);
1365 CStringW str = pEditType->CommandLineMap.GetValueAt(iIndex);
1366 StringCbCopyW(action.szApp, sizeof(action.szApp), LPCWSTR(str));
1367 }
1368
1369 // open dialog
1372 {
1373 SendMessageW(action.hwndLB, LB_DELETESTRING, iItem, 0);
1374 SendMessageW(action.hwndLB, LB_INSERTSTRING, iItem, LPARAM(action.szAction));
1375 pEditType->CommandLineMap.SetAt(action.szAction, action.szApp);
1376 }
1377 break;
1378
1380 EditTypeDlg_OnRemove(hwndDlg, pEditType);
1381 break;
1382
1384 action.hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
1385 iItem = SendMessageW(action.hwndLB, LB_GETCURSEL, 0, 0);
1386 if (iItem == LB_ERR)
1387 break;
1388
1389 SendMessageW(action.hwndLB, LB_GETTEXT, iItem, LPARAM(action.szAction));
1390
1391 // set default
1392 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), action.szAction);
1394 InvalidateRect(action.hwndLB, NULL, TRUE);
1395 break;
1396 }
1397}
1398
1399static BOOL
1401{
1402 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
1403 StringCbCopyW(pEditType->szIconPath, sizeof(pEditType->szIconPath), pEntry->IconPath);
1404 pEditType->nIconIndex = pEntry->nIconIndex;
1405 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), L"open");
1406
1407 // set info
1409 SetDlgItemTextW(hwndDlg, IDC_EDITTYPE_TEXT, pEntry->ClassName);
1410 EditTypeDlg_ReadClass(hwndDlg, pEditType, pEntry->ClassKey);
1412
1413 // is listbox empty?
1414 if (SendDlgItemMessageW(hwndDlg, IDC_EDITTYPE_LISTBOX, LB_GETCOUNT, 0, 0) == 0)
1415 {
1419 }
1420 else
1421 {
1422 // select first item
1424 }
1425
1427
1428 return TRUE;
1429}
1430
1431// IDD_EDITTYPE
1432static INT_PTR CALLBACK
1434{
1435 static PEDITTYPE_DIALOG s_pEditType = NULL;
1436 LPDRAWITEMSTRUCT pDraw;
1437 LPMEASUREITEMSTRUCT pMeasure;
1438
1439 switch (uMsg)
1440 {
1441 case WM_INITDIALOG:
1442 s_pEditType = (PEDITTYPE_DIALOG)lParam;
1443 return EditTypeDlg_OnInitDialog(hwndDlg, s_pEditType);
1444
1445 case WM_DRAWITEM:
1446 pDraw = LPDRAWITEMSTRUCT(lParam);
1447 return EditTypeDlg_OnDrawItem(hwndDlg, pDraw, s_pEditType);
1448
1449 case WM_MEASUREITEM:
1450 pMeasure = LPMEASUREITEMSTRUCT(lParam);
1451 return EditTypeDlg_OnMeasureItem(hwndDlg, pMeasure, s_pEditType);
1452
1453 case WM_COMMAND:
1454 EditTypeDlg_OnCommand(hwndDlg, LOWORD(wParam), HIWORD(wParam), s_pEditType);
1455 break;
1456 }
1457
1458 return 0;
1459}
1460
1462// FileTypesDlg
1463
1464static INT CALLBACK
1465FileTypesDlg_CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
1466{
1467 PFILE_TYPE_ENTRY Entry1, Entry2;
1468 int x;
1469
1470 Entry1 = (PFILE_TYPE_ENTRY)lParam1;
1471 Entry2 = (PFILE_TYPE_ENTRY)lParam2;
1472
1473 x = wcsicmp(Entry1->FileExtension, Entry2->FileExtension);
1474 if (x != 0)
1475 return x;
1476
1477 return wcsicmp(Entry1->FileDescription, Entry2->FileDescription);
1478}
1479
1480static VOID
1482{
1483 RECT clientRect;
1484 LVCOLUMNW col;
1485 WCHAR szName[50];
1486 DWORD dwStyle;
1487 INT columnSize;
1488
1490 {
1491 // default to english
1492 wcscpy(szName, L"Extensions");
1493 }
1494
1495 // make sure its null terminated
1496 szName[_countof(szName) - 1] = 0;
1497
1498 GetClientRect(hListView, &clientRect);
1499 ZeroMemory(&col, sizeof(LV_COLUMN));
1500 columnSize = (clientRect.right - clientRect.left) / 4;
1501 col.iSubItem = 0;
1503 col.fmt = LVCFMT_FIXED_WIDTH;
1504 col.cx = columnSize | LVCFMT_LEFT;
1505 col.cchTextMax = wcslen(szName);
1506 col.pszText = szName;
1507 SendMessageW(hListView, LVM_INSERTCOLUMNW, 0, (LPARAM)&col);
1508
1510 {
1511 // default to english
1512 wcscpy(szName, L"File Types");
1513 ERR("Failed to load localized string!\n");
1514 }
1515
1516 col.iSubItem = 1;
1517 col.cx = clientRect.right - clientRect.left - columnSize - GetSystemMetrics(SM_CYVSCROLL);
1518 col.cchTextMax = wcslen(szName);
1519 col.pszText = szName;
1520 SendMessageW(hListView, LVM_INSERTCOLUMNW, 1, (LPARAM)&col);
1521
1522 // set full select style
1523 dwStyle = (DWORD)SendMessage(hListView, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
1524 dwStyle = dwStyle | LVS_EX_FULLROWSELECT;
1525 SendMessage(hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
1526}
1527
1528static PFILE_TYPE_ENTRY
1530{
1531 HWND hListView;
1532 DWORD dwIndex = 0;
1533 WCHAR szName[50];
1534 WCHAR szFile[100];
1535 DWORD dwName;
1536 LVITEMW lvItem;
1537 INT iItem = 0;
1538 HIMAGELIST himlLarge, himlSmall;
1539
1540 // create imagelists
1542 ILC_COLOR32 | ILC_MASK, 256, 20);
1544 ILC_COLOR32 | ILC_MASK, 256, 20);
1545
1546 // set imagelists to listview.
1547 hListView = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
1548 ListView_SetImageList(hListView, himlLarge, LVSIL_NORMAL);
1549 ListView_SetImageList(hListView, himlSmall, LVSIL_SMALL);
1550
1551 FileTypesDlg_InitListView(hwndDlg, hListView);
1552
1553 szFile[0] = 0;
1555 {
1556 // default to english
1557 wcscpy(szFile, L"%s File");
1558 }
1559 szFile[(_countof(szFile)) - 1] = 0;
1560
1561 dwName = _countof(szName);
1562
1563 while (RegEnumKeyExW(HKEY_CLASSES_ROOT, dwIndex++, szName, &dwName,
1565 {
1566 if (FileTypesDlg_InsertToLV(hListView, szName, iItem, szFile))
1567 ++iItem;
1568 dwName = _countof(szName);
1569 }
1570
1571 // Leave if the list is empty
1572 if (iItem == 0)
1573 return NULL;
1574
1575 // sort list
1577
1578 // select first item
1579 ZeroMemory(&lvItem, sizeof(LVITEMW));
1580 lvItem.mask = LVIF_STATE;
1581 lvItem.stateMask = (UINT)-1;
1582 lvItem.state = LVIS_FOCUSED | LVIS_SELECTED;
1583 lvItem.iItem = 0;
1584 ListView_SetItem(hListView, &lvItem);
1585
1586 lvItem.mask = LVIF_PARAM;
1587 ListView_GetItem(hListView, &lvItem);
1588
1589 return (PFILE_TYPE_ENTRY)lvItem.lParam;
1590}
1591
1592static inline PFILE_TYPE_ENTRY
1593FileTypesDlg_GetEntry(HWND hListView, INT iItem = -1)
1594{
1595 if (iItem == -1)
1596 {
1597 iItem = ListView_GetNextItem(hListView, -1, LVNI_SELECTED);
1598 if (iItem == -1)
1599 return NULL;
1600 }
1601
1602 LV_ITEMW lvItem = { LVIF_PARAM, iItem };
1603 if (ListView_GetItem(hListView, &lvItem))
1604 return (PFILE_TYPE_ENTRY)lvItem.lParam;
1605
1606 return NULL;
1607}
1608
1609static void
1611{
1612 CStringW strRemoveExt(MAKEINTRESOURCEW(IDS_REMOVE_EXT));
1613 CStringW strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
1614 if (MessageBoxW(hwndDlg, strRemoveExt, strTitle, MB_ICONQUESTION | MB_YESNO) == IDYES)
1615 {
1616 FileTypesDlg_RemoveExt(hwndDlg);
1617
1618 // Select first item (Win2k3 does it)
1619 LV_ITEMW item = { LVIF_STATE };
1620 item.stateMask = item.state = LVIS_FOCUSED | LVIS_SELECTED;
1621 item.iItem = 0;
1623 }
1624}
1625
1626static void
1628{
1629 WCHAR Buffer[255];
1630 static HBITMAP s_hbmProgram = NULL;
1631
1632 // format buffer and set groupbox text
1633 CStringW strFormat(MAKEINTRESOURCEW(IDS_FILE_DETAILS));
1634 StringCbPrintfW(Buffer, sizeof(Buffer), strFormat, &pEntry->FileExtension[1]);
1636
1637 // format buffer and set description
1638 strFormat.LoadString(IDS_FILE_DETAILSADV);
1639 StringCbPrintfW(Buffer, sizeof(Buffer), strFormat,
1640 &pEntry->FileExtension[1], pEntry->FileDescription,
1641 pEntry->FileDescription);
1643
1644 // delete previous program image
1645 if (s_hbmProgram)
1646 {
1647 DeleteObject(s_hbmProgram);
1648 s_hbmProgram = NULL;
1649 }
1650
1651 // set program image
1652 HICON hIconSm = NULL;
1653 ExtractIconExW(pEntry->ProgramPath, 0, NULL, &hIconSm, 1);
1654 s_hbmProgram = BitmapFromIcon(hIconSm, 16, 16);
1657
1658 // set program name
1659 if (pEntry->AppName[0])
1660 SetDlgItemTextW(hwndDlg, IDC_FILETYPES_APPNAME, pEntry->AppName);
1661 else
1662 SetDlgItemTextW(hwndDlg, IDC_FILETYPES_APPNAME, L"ReactOS");
1663
1664 // Enable the Delete button
1665 if (pEntry->EditFlags & 0x00000010) // FTA_NoRemove
1667 else
1669}
1670
1671// IDD_FOLDER_OPTIONS_FILETYPES
1674 HWND hwndDlg,
1675 UINT uMsg,
1676 WPARAM wParam,
1677 LPARAM lParam)
1678{
1679 LPNMLISTVIEW lppl;
1682 NEWEXT_DIALOG newext;
1683 EDITTYPE_DIALOG edittype;
1684
1685 switch (uMsg)
1686 {
1687 case WM_INITDIALOG:
1688 pEntry = FileTypesDlg_DoList(hwndDlg);
1689
1690 // Disable the Delete button if the listview is empty
1691 // the selected item should not be deleted by the user
1692 if (pEntry == NULL || (pEntry->EditFlags & 0x00000010)) // FTA_NoRemove
1694 return TRUE;
1695
1696 case WM_COMMAND:
1697 switch (LOWORD(wParam))
1698 {
1699 case IDC_FILETYPES_NEW:
1700 newext.hwndLV = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
1702 hwndDlg, NewExtDlgProc, (LPARAM)&newext))
1703 {
1704 FileTypesDlg_AddExt(hwndDlg, newext.szExt, newext.szFileType);
1705 }
1706 break;
1707
1709 FileTypesDlg_OnDelete(hwndDlg);
1710 break;
1711
1714 if (pEntry)
1715 {
1716 ZeroMemory(&Info, sizeof(Info));
1718 Info.pcszFile = pEntry->FileExtension;
1719 Info.pcszClass = NULL;
1720 SHOpenWithDialog(hwndDlg, &Info);
1721 }
1722 break;
1723
1725 edittype.hwndLV = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
1726 edittype.pEntry = FileTypesDlg_GetEntry(edittype.hwndLV);
1727 if (edittype.pEntry)
1728 {
1730 hwndDlg, EditTypeDlgProc, (LPARAM)&edittype);
1731 }
1732 break;
1733 }
1734 break;
1735
1736 case WM_NOTIFY:
1737 lppl = (LPNMLISTVIEW) lParam;
1738 switch (lppl->hdr.code)
1739 {
1740 case LVN_KEYDOWN:
1741 {
1742 LV_KEYDOWN *pKeyDown = (LV_KEYDOWN *)lParam;
1743 if (pKeyDown->wVKey == VK_DELETE)
1744 {
1745 FileTypesDlg_OnDelete(hwndDlg);
1746 }
1747 break;
1748 }
1749
1750 case NM_DBLCLK:
1751 edittype.hwndLV = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
1752 edittype.pEntry = FileTypesDlg_GetEntry(edittype.hwndLV);
1753 if (edittype.pEntry)
1754 {
1756 hwndDlg, EditTypeDlgProc, (LPARAM)&edittype);
1757 }
1758 break;
1759
1760 case LVN_DELETEALLITEMS:
1761 return FALSE; // send LVN_DELETEITEM
1762
1763 case LVN_DELETEITEM:
1765 if (pEntry)
1766 {
1767 DestroyIcon(pEntry->hIconLarge);
1768 DestroyIcon(pEntry->hIconSmall);
1770 }
1771 return FALSE;
1772
1773 case LVN_ITEMCHANGING:
1775 if (!pEntry)
1776 {
1777 return TRUE;
1778 }
1779
1780 if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED))
1781 {
1783 }
1784 break;
1785
1786 case PSN_SETACTIVE:
1787 // On page activation, set the focus to the listview
1789 break;
1790 }
1791 break;
1792 }
1793
1794 return FALSE;
1795}
static HDC hDC
Definition: 3dtext.c:33
HRESULT WINAPI SHOpenWithDialog(HWND hwndParent, const OPENASINFO *poainfo)
#define shell32_hInstance
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
HFONT hFont
Definition: main.c:53
HKEY hClassKey
Definition: umpnpmgr.c:45
#define ERR(fmt,...)
Definition: debug.h:110
#define RegCloseKey(hKey)
Definition: registry.h:49
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
TVal & GetValueAt(int nIndex)
Definition: atlsimpcoll.h:358
TKey & GetKeyAt(int nIndex)
Definition: atlsimpcoll.h:341
BOOL SetAt(const TKey &key, const TVal &val)
Definition: atlsimpcoll.h:402
int FindKey(const TKey &key) const
Definition: atlsimpcoll.h:315
BOOL Remove(const TKey &key)
Definition: atlsimpcoll.h:378
int GetSize() const
Definition: atlsimpcoll.h:353
BOOL LoadString(_In_ UINT nID)
Definition: cstringt.h:639
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
Definition: bufpool.h:45
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define OFN_EXPLORER
Definition: commdlg.h:104
#define OPENFILENAME_SIZE_VERSION_400W
Definition: commdlg.h:397
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
#define OFN_ENABLESIZING
Definition: commdlg.h:101
#define OFN_FILEMUSTEXIST
Definition: commdlg.h:106
#define OFN_PATHMUSTEXIST
Definition: commdlg.h:117
static TAGID TAGID find
Definition: db.cpp:155
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG RegLoadMUIStringW(IN HKEY hKey, IN LPCWSTR pszValue OPTIONAL, OUT LPWSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCWSTR pszDirectory OPTIONAL)
Definition: muireg.c:53
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3362
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2533
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4911
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4132
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2422
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:804
short WINAPI GetFileTitleW(LPCWSTR lpFile, LPWSTR lpTitle, WORD cbBuf)
Definition: filedlg.c:4856
BOOL WINAPI GetOpenFileNameW(OPENFILENAMEW *ofn)
Definition: filedlg.c:4736
static const WCHAR rc2[]
Definition: oid.c:1216
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define FreeLibrary(x)
Definition: compat.h:748
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define wcsicmp
Definition: compat.h:15
#define lstrlenW
Definition: compat.h:750
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2352
const WCHAR * action
Definition: action.c:7479
static const WCHAR IconIndex[]
Definition: install.c:52
static const WCHAR IconPath[]
Definition: install.c:51
BOOL WINAPI PickIconDlg(HWND hWndOwner, LPWSTR lpstrFile, UINT nMaxFile, INT *lpdwIconIndex)
Definition: dialogs.cpp:362
HRESULT WINAPI AssocQueryStringW(ASSOCF cfFlags, ASSOCSTR str, LPCWSTR pszAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut)
Definition: assoc.c:431
int WINAPI PathParseIconLocationW(LPWSTR lpszPath)
Definition: path.c:1092
DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPCWSTR lpszSubKey)
Definition: reg.c:1546
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1869
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
static BOOL DeleteExt(HWND hwndDlg, LPCWSTR pszExt)
Definition: filetypes.cpp:48
#define LISTBOX_MARGIN
Definition: filetypes.cpp:205
static BOOL QueryFileDescription(LPCWSTR ProgramPath, LPWSTR pszName, INT cchName)
Definition: filetypes.cpp:178
static VOID FileTypesDlg_InitListView(HWND hwndDlg, HWND hListView)
Definition: filetypes.cpp:1481
static BOOL FileTypesDlg_RemoveExt(HWND hwndDlg)
Definition: filetypes.cpp:789
static void FileTypesDlg_OnItemChanging(HWND hwndDlg, PFILE_TYPE_ENTRY pEntry)
Definition: filetypes.cpp:1627
static void SetFileTypeEntryDefaultIcon(PFILE_TYPE_ENTRY Entry)
Definition: filetypes.cpp:191
struct EDITTYPE_DIALOG * PEDITTYPE_DIALOG
static INT CALLBACK FileTypesDlg_CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
Definition: filetypes.cpp:1465
static BOOL NewExtDlg_OnInitDialog(HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
Definition: filetypes.cpp:421
static INT_PTR CALLBACK NewActionDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:897
static VOID NewExtDlg_OnAdvanced(HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
Definition: filetypes.cpp:351
static BOOL EditTypeDlg_OnDrawItem(HWND hwndDlg, LPDRAWITEMSTRUCT pDraw, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:254
static BOOL EditTypeDlg_OnRemove(HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:1249
static void FileTypesDlg_OnDelete(HWND hwndDlg)
Definition: filetypes.cpp:1610
static BOOL EditTypeDlg_UpdateEntryIcon(HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR IconPath, INT IconIndex)
Definition: filetypes.cpp:1013
static BOOL FileTypesDlg_InsertToLV(HWND hListView, LPCWSTR szName, INT iItem, LPCWSTR szFile)
Definition: filetypes.cpp:560
static INT_PTR CALLBACK NewExtDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:523
static BOOL EditTypeDlg_OnMeasureItem(HWND hwndDlg, LPMEASUREITEMSTRUCT pMeasure, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:318
static HICON DoExtractIcon(PFILE_TYPE_ENTRY Entry, LPCWSTR IconPath, INT iIndex=0, BOOL bSmall=FALSE)
Definition: filetypes.cpp:73
static void EditActionDlg_OnOK(HWND hwndDlg, PACTION_DIALOG pEditAct)
Definition: filetypes.cpp:933
static void EditTypeDlg_OnChangeIcon(HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:218
static BOOL GetFileTypeIconsByKey(HKEY hKey, PFILE_TYPE_ENTRY Entry)
Definition: filetypes.cpp:154
static BOOL NewExtDlg_OnOK(HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
Definition: filetypes.cpp:447
static INT_PTR CALLBACK EditTypeDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:1433
static PFILE_TYPE_ENTRY FileTypesDlg_GetEntry(HWND hListView, INT iItem=-1)
Definition: filetypes.cpp:1593
static BOOL EditTypeDlg_ReadClass(HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR ClassKey)
Definition: filetypes.cpp:1160
struct ACTION_DIALOG * PACTION_DIALOG
static BOOL GetFileTypeIconsEx(PFILE_TYPE_ENTRY Entry, LPCWSTR IconLocation)
Definition: filetypes.cpp:125
static BOOL EditTypeDlg_WriteClass(HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR ClassKey, LPCWSTR ClassName, INT cchName)
Definition: filetypes.cpp:1058
static INT_PTR CALLBACK EditActionDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:968
static void DoFileTypeIconLocation(PFILE_TYPE_ENTRY Entry, LPCWSTR IconLocation)
Definition: filetypes.cpp:111
struct NEWEXT_DIALOG * PNEWEXT_DIALOG
INT_PTR CALLBACK FolderOptionsFileTypesDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:1673
static void NewActionDlg_OnOK(HWND hwndDlg, PACTION_DIALOG pNewAct)
Definition: filetypes.cpp:859
static BOOL EditTypeDlg_OnInitDialog(HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:1400
static void EditTypeDlg_OnOK(HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:1227
static PFILE_TYPE_ENTRY FileTypesDlg_DoList(HWND hwndDlg)
Definition: filetypes.cpp:1529
struct FILE_TYPE_ENTRY * PFILE_TYPE_ENTRY
static void ActionDlg_OnBrowse(HWND hwndDlg, PACTION_DIALOG pNewAct, BOOL bEdit=FALSE)
Definition: filetypes.cpp:820
static BOOL FileTypesDlg_AddExt(HWND hwndDlg, LPCWSTR pszExt, LPCWSTR pszFileType)
Definition: filetypes.cpp:710
static void EditTypeDlg_OnCommand(HWND hwndDlg, UINT id, UINT code, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:1275
LPCWSTR g_pszSpace
LPCWSTR g_pszShell32
FxAutoRegKey hKey
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
pKey DeleteObject()
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons)
Definition: iconcache.cpp:849
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
#define S_OK
Definition: intsafe.h:52
static HBITMAP BitmapFromIcon(HICON hIcon)
Definition: kbswitch.c:300
#define REG_SZ
Definition: layer.c:22
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define ASSERT(a)
Definition: mode.c:44
LPCWSTR szPath
Definition: env.c:37
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
static HICON
Definition: imagelist.c:84
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
static ATOM item
Definition: dde.c:856
LPTSTR szFilter
Definition: mplay32.c:30
HICON hIcon
Definition: msconfig.c:44
HICON hIconSm
Definition: msconfig.c:44
unsigned int UINT
Definition: ndis.h:50
#define REG_BINARY
Definition: nt_native.h:1496
#define KEY_READ
Definition: nt_native.h:1023
#define KEY_WRITE
Definition: nt_native.h:1031
#define DWORD
Definition: nt_native.h:44
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
Definition: ntbasedef.h:319
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:16
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
long LONG
Definition: pedump.c:60
static const WCHAR szName[]
Definition: powrprof.c:45
#define PSN_SETACTIVE
Definition: prsht.h:115
#define LVSIL_SMALL
Definition: commctrl.h:2299
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define LVFI_STRING
Definition: commctrl.h:2437
#define NM_DBLCLK
Definition: commctrl.h:131
#define LVIF_STATE
Definition: commctrl.h:2312
#define ListView_SetImageList(hwnd, himl, iImageList)
Definition: commctrl.h:2304
#define LVNI_SELECTED
Definition: commctrl.h:2424
#define ListView_GetItemText(hwndLV, i, iSubItem_, pszText_, cchTextMax_)
Definition: commctrl.h:2684
#define LVN_DELETEALLITEMS
Definition: commctrl.h:3134
#define LVCF_WIDTH
Definition: commctrl.h:2587
#define ListView_GetImageList(hwnd, iImageList)
Definition: commctrl.h:2296
_Out_opt_ int * cx
Definition: commctrl.h:585
#define ILC_COLOR32
Definition: commctrl.h:358
#define ListView_GetNextItem(hwnd, i, flags)
Definition: commctrl.h:2434
#define LVN_ITEMCHANGING
Definition: commctrl.h:3130
#define LVS_EX_FULLROWSELECT
Definition: commctrl.h:2734
#define ListView_GetItemCount(hwnd)
Definition: commctrl.h:2307
#define ListView_SortItems(hwndLV, _pfnCompare, _lPrm)
Definition: commctrl.h:2703
#define LVIS_SELECTED
Definition: commctrl.h:2319
#define LV_FINDINFO
Definition: commctrl.h:2445
#define LVIF_PARAM
Definition: commctrl.h:2311
#define LV_ITEM
Definition: commctrl.h:2337
struct tagNMLISTVIEW * LPNMLISTVIEW
#define LVM_INSERTCOLUMNW
Definition: commctrl.h:2632
#define LVIF_TEXT
Definition: commctrl.h:2309
#define LVM_GETEXTENDEDLISTVIEWSTYLE
Definition: commctrl.h:2727
#define ListView_SetItem(hwnd, pitem)
Definition: commctrl.h:2401
#define LVCF_FMT
Definition: commctrl.h:2586
#define ImageList_AddIcon(himl, hicon)
Definition: commctrl.h:415
#define LVCF_SUBITEM
Definition: commctrl.h:2589
#define LV_ITEMW
Definition: commctrl.h:2332
#define LVCFMT_LEFT
Definition: commctrl.h:2598
#define ILC_MASK
Definition: commctrl.h:351
#define ListView_DeleteItem(hwnd, i)
Definition: commctrl.h:2411
#define LVN_KEYDOWN
Definition: commctrl.h:3184
#define LV_KEYDOWN
Definition: commctrl.h:3186
#define LVIF_IMAGE
Definition: commctrl.h:2310
#define LVM_INSERTITEMW
Definition: commctrl.h:2404
#define LVCF_TEXT
Definition: commctrl.h:2588
#define LVN_DELETEITEM
Definition: commctrl.h:3133
#define LVIS_FOCUSED
Definition: commctrl.h:2318
#define ListView_GetItem(hwnd, pitem)
Definition: commctrl.h:2394
#define ListView_FindItem(hwnd, iStart, plvfi)
Definition: commctrl.h:2470
#define ListView_EnsureVisible(hwndLV, i, fPartialOK)
Definition: commctrl.h:2519
#define LVM_SETEXTENDEDLISTVIEWSTYLE
Definition: commctrl.h:2724
#define LV_COLUMN
Definition: commctrl.h:2547
#define LVSIL_NORMAL
Definition: commctrl.h:2298
#define WM_NOTIFY
Definition: richedit.h:61
const WCHAR * str
#define REG_DWORD
Definition: sdbapi.c:596
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl _wcsupr(_Inout_z_ wchar_t *_String)
_CRTIMP wchar_t *__cdecl _wcslwr(_Inout_z_ wchar_t *_String)
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:415
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:163
@ OAIF_REGISTER_EXT
Definition: shlobj.h:2666
@ OAIF_ALLOW_REGISTRATION
Definition: shlobj.h:2665
#define SHCNE_ASSOCCHANGED
Definition: shlobj.h:1896
#define SHCNF_FLUSHNOWAIT
Definition: shlobj.h:1914
@ ASSOCSTR_EXECUTABLE
Definition: shlwapi.h:604
@ ASSOCF_INIT_IGNOREUNKNOWN
Definition: shlwapi.h:593
#define IDD_ACTION
Definition: shresdef.h:520
#define IDS_COLUMN_EXTENSION
Definition: shresdef.h:144
#define IDC_FILETYPES_DESCRIPTION
Definition: shresdef.h:445
#define IDS_FILE_DETAILS
Definition: shresdef.h:188
#define IDC_ACTION_BROWSE
Definition: shresdef.h:496
#define IDS_REMOVE_EXT
Definition: shresdef.h:334
#define IDC_EDITTYPE_SET_DEFAULT
Definition: shresdef.h:488
#define IDS_NEWEXT_SPECIFY_EXT
Definition: shresdef.h:323
#define IDC_EDITTYPE_ICON
Definition: shresdef.h:481
#define IDC_EDITTYPE_EDIT_BUTTON
Definition: shresdef.h:486
#define IDI_SHELL_EXE
Definition: shresdef.h:551
#define IDC_NEWEXT_ADVANCED
Definition: shresdef.h:451
#define IDC_NEWEXT_COMBOBOX
Definition: shresdef.h:452
#define IDC_FILETYPES_LISTVIEW
Definition: shresdef.h:439
#define IDC_EDITTYPE_TEXT
Definition: shresdef.h:482
#define IDC_ACTION_USE_DDE
Definition: shresdef.h:497
#define IDS_FILE_EXT_TYPE
Definition: shresdef.h:190
#define IDC_FILETYPES_DETAILS_GROUPBOX
Definition: shresdef.h:442
#define IDS_EXE_FILTER
Definition: shresdef.h:331
#define IDS_SPECIFY_ACTION
Definition: shresdef.h:327
#define IDD_NEWEXTENSION
Definition: shresdef.h:518
#define IDS_NEWEXT_EXT_IN_USE
Definition: shresdef.h:325
#define IDS_NEWEXT_ADVANCED_RIGHT
Definition: shresdef.h:321
#define IDS_NEWEXT_ALREADY_ASSOC
Definition: shresdef.h:324
#define IDC_FILETYPES_ICON
Definition: shresdef.h:447
#define IDS_INVALID_PROGRAM
Definition: shresdef.h:328
#define IDC_ACTION_APP
Definition: shresdef.h:495
#define IDS_NEWEXT_ADVANCED_LEFT
Definition: shresdef.h:320
#define IDC_EDITTYPE_LISTBOX
Definition: shresdef.h:484
#define IDD_EDITTYPE
Definition: shresdef.h:519
#define IDC_FILETYPES_APPNAME
Definition: shresdef.h:443
#define IDS_REMOVE_ACTION
Definition: shresdef.h:329
#define IDS_NEWEXT_NEW
Definition: shresdef.h:322
#define IDC_NEWEXT_ASSOC
Definition: shresdef.h:453
#define IDC_FILETYPES_ADVANCED
Definition: shresdef.h:446
#define IDS_OPEN_WITH
Definition: shresdef.h:136
#define IDS_FILE_TYPES
Definition: shresdef.h:187
#define IDS_ACTION_EXISTS
Definition: shresdef.h:330
#define IDI_SHELL_FOLDER_OPTIONS
Definition: shresdef.h:662
#define IDC_FILETYPES_DELETE
Definition: shresdef.h:441
#define IDC_EDITTYPE_NEW
Definition: shresdef.h:485
#define IDC_EDITTYPE_SAME_WINDOW
Definition: shresdef.h:491
#define IDC_FILETYPES_CHANGE
Definition: shresdef.h:444
#define IDC_NEWEXT_EDIT
Definition: shresdef.h:450
#define IDS_FILE_DETAILSADV
Definition: shresdef.h:189
#define IDC_FILETYPES_NEW
Definition: shresdef.h:440
#define IDC_EDITTYPE_CHANGE_ICON
Definition: shresdef.h:483
#define IDS_EDITING_ACTION
Definition: shresdef.h:332
#define IDC_ACTION_ACTION
Definition: shresdef.h:494
#define IDC_EDITTYPE_REMOVE
Definition: shresdef.h:487
OPENFILENAME ofn
Definition: sndrec32.cpp:56
#define _countof(array)
Definition: sndvol32.h:68
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
WCHAR szAction[64]
Definition: filetypes.cpp:814
WCHAR ClassName[64]
Definition: filetypes.cpp:813
WCHAR szApp[MAX_PATH]
Definition: filetypes.cpp:815
CSimpleMap< CStringW, CStringW > CommandLineMap
Definition: filetypes.cpp:211
WCHAR szDefaultVerb[64]
Definition: filetypes.cpp:214
WCHAR szIconPath[MAX_PATH]
Definition: filetypes.cpp:212
PFILE_TYPE_ENTRY pEntry
Definition: filetypes.cpp:210
base of all file and directory entries
Definition: entries.h:83
Definition: filetypes.cpp:33
INT nIconIndex
Definition: filetypes.cpp:44
WCHAR FileExtension[30]
Definition: filetypes.cpp:34
WCHAR IconPath[MAX_PATH]
Definition: filetypes.cpp:43
WCHAR ClassKey[MAX_PATH]
Definition: filetypes.cpp:36
WCHAR AppName[64]
Definition: filetypes.cpp:39
HICON hIconSmall
Definition: filetypes.cpp:41
WCHAR FileDescription[100]
Definition: filetypes.cpp:35
WCHAR ClassName[64]
Definition: filetypes.cpp:37
DWORD EditFlags
Definition: filetypes.cpp:38
WCHAR ProgramPath[MAX_PATH]
Definition: filetypes.cpp:42
HICON hIconLarge
Definition: filetypes.cpp:40
LONG lfWeight
Definition: dimm.idl:63
WCHAR szExt[16]
Definition: filetypes.cpp:346
WCHAR szFileType[64]
Definition: filetypes.cpp:347
Definition: inflate.c:139
Definition: copy.c:22
int cchTextMax
Definition: commctrl.h:2568
LPWSTR pszText
Definition: commctrl.h:2567
LPWSTR pszText
Definition: commctrl.h:2365
int iSubItem
Definition: commctrl.h:2362
UINT state
Definition: commctrl.h:2363
UINT mask
Definition: commctrl.h:2360
LPARAM lParam
Definition: commctrl.h:2368
UINT stateMask
Definition: commctrl.h:2364
int iImage
Definition: commctrl.h:2367
UINT code
Definition: winuser.h:3159
HWND hwndFrom
Definition: winuser.h:3157
UINT uNewState
Definition: commctrl.h:3036
UINT uOldState
Definition: commctrl.h:3037
LPCSTR lpstrDefExt
Definition: commdlg.h:345
HWND hwndOwner
Definition: commdlg.h:330
LPCSTR lpstrTitle
Definition: commdlg.h:341
LPSTR lpstrFile
Definition: commdlg.h:336
DWORD Flags
Definition: commdlg.h:342
DWORD lStructSize
Definition: commdlg.h:329
LPCSTR lpstrFilter
Definition: commdlg.h:332
DWORD nMaxFile
Definition: commdlg.h:337
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
Definition: time.h:68
int32_t INT_PTR
Definition: typedefs.h:64
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
#define HIWORD(l)
Definition: typedefs.h:247
Definition: pdh_main.c:94
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define ZeroMemory
Definition: winbase.h:1712
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:342
#define lstrlen
Definition: winbase.h:3811
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2767
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
BOOL WINAPI GetTextMetricsW(_In_ HDC, _Out_ LPTEXTMETRICW)
Definition: text.c:221
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:999
#define FW_BOLD
Definition: wingdi.h:378
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
#define GetObject
Definition: wingdi.h:4468
#define RegOpenKeyEx
Definition: winreg.h:520
#define RegCreateKeyEx
Definition: winreg.h:501
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define LB_ERR
Definition: winuser.h:2432
struct tagDRAWITEMSTRUCT * LPDRAWITEMSTRUCT
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
DWORD WINAPI GetSysColor(_In_ int)
#define LB_GETCOUNT
Definition: winuser.h:2038
#define ODS_SELECTED
Definition: winuser.h:2545
#define SW_HIDE
Definition: winuser.h:768
#define SWP_NOACTIVATE
Definition: winuser.h:1242
#define DT_NOPREFIX
Definition: winuser.h:537
#define IMAGE_BITMAP
Definition: winuser.h:211
#define COLOR_WINDOW
Definition: winuser.h:918
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
struct tagMEASUREITEMSTRUCT * LPMEASUREITEMSTRUCT
#define STM_SETICON
Definition: winuser.h:2092
#define IDCANCEL
Definition: winuser.h:831
#define LB_GETTEXT
Definition: winuser.h:2049
#define SM_CYVSCROLL
Definition: winuser.h:981
#define IMAGE_ICON
Definition: winuser.h:212
#define COLOR_WINDOWTEXT
Definition: winuser.h:921
#define LBN_DBLCLK
Definition: winuser.h:2071
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define COLOR_HIGHLIGHT
Definition: winuser.h:926
#define DT_SINGLELINE
Definition: winuser.h:540
#define WM_COMMAND
Definition: winuser.h:1740
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2203
#define CB_SETCURSEL
Definition: winuser.h:1961
#define SM_CYSMICON
Definition: winuser.h:1013
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define SW_SHOWNOACTIVATE
Definition: winuser.h:774
#define WM_INITDIALOG
Definition: winuser.h:1739
#define MB_YESNO
Definition: winuser.h:817
#define LB_ADDSTRING
Definition: winuser.h:2031
BOOL WINAPI EndDeferWindowPos(_In_ HDWP)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
#define WM_GETFONT
Definition: winuser.h:1651
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define STM_SETIMAGE
Definition: winuser.h:2093
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:830
#define WM_DRAWITEM
Definition: winuser.h:1645
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define MB_ICONERROR
Definition: winuser.h:787
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
#define SM_CXSMICON
Definition: winuser.h:1012
#define DT_LEFT
Definition: winuser.h:534
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define LB_DELETESTRING
Definition: winuser.h:2032
#define SM_CYICON
Definition: winuser.h:973
HWND WINAPI SetFocus(_In_opt_ HWND)
#define LB_FINDSTRING
Definition: winuser.h:2034
#define EM_SETLIMITTEXT
Definition: winuser.h:2011
#define IDNO
Definition: winuser.h:836
#define LB_INSERTSTRING
Definition: winuser.h:2053
#define CB_ADDSTRING
Definition: winuser.h:1936
#define SendMessage
Definition: winuser.h:5843
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define COLOR_HIGHLIGHTTEXT
Definition: winuser.h:927
HDC WINAPI GetDC(_In_opt_ HWND)
#define EM_SETSEL
Definition: winuser.h:2018
#define WM_MEASUREITEM
Definition: winuser.h:1646
#define MB_ICONWARNING
Definition: winuser.h:786
#define DT_VCENTER
Definition: winuser.h:543
#define LBN_SELCHANGE
Definition: winuser.h:2075
#define MB_ICONQUESTION
Definition: winuser.h:789
#define MB_ICONINFORMATION
Definition: winuser.h:802
HDWP WINAPI DeferWindowPos(_In_ HDWP, _In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define VK_DELETE
Definition: winuser.h:2233
#define LB_SETCURSEL
Definition: winuser.h:2063
BOOL WINAPI DrawFocusRect(_In_ HDC, _In_ LPCRECT)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define IDYES
Definition: winuser.h:835
#define SWP_NOZORDER
Definition: winuser.h:1247
#define LB_GETCURSEL
Definition: winuser.h:2039
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define SM_CXICON
Definition: winuser.h:972
#define ODS_FOCUS
Definition: winuser.h:2549
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2075
int WINAPI GetSystemMetrics(_In_ int)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
HDWP WINAPI BeginDeferWindowPos(_In_ int)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2053
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185