packwiz.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 17k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include <windows.h>
  2. #include <prsht.h>
  3. #include <shlwapi.h>
  4. #include "priv.h"
  5. #include <shsemip.h>
  6. #include "ids.h"
  7. //
  8. // FUNCTION: PackWiz_SelectFileDlgProc(HWND,UINT,WPARAM,LPARAM)
  9. //
  10. // PURPOSE:  Dialog procedure for FIRST page of Create New Package Wizard
  11. // 
  12. //
  13. BOOL CALLBACK PackWiz_SelectFileDlgProc(HWND hDlg, UINT uMsg , WPARAM wParam, LPARAM lParam)
  14. {
  15.     LPPACKAGER_INFO lppi = (LPPACKAGER_INFO)GetWindowLong(hDlg, DWL_USER);
  16.     
  17.     switch (uMsg) 
  18.     {
  19.     case WM_INITDIALOG:
  20.         lppi = (LPPACKAGER_INFO)((LPPROPSHEETPAGE)lParam)->lParam;
  21.         SetWindowLong(hDlg, DWL_USER, (LONG)lppi);
  22.         Edit_LimitText(GetDlgItem(hDlg, IDC_COMMAND), ARRAYSIZE(lppi->szFilename) - 1);
  23.         *lppi->szFilename = TEXT('');
  24.         break;
  25.         
  26.     case WM_COMMAND:
  27.         switch (GET_WM_COMMAND_ID(wParam, lParam))
  28.         {
  29.         case IDHELP:
  30.             break;
  31.             
  32.         case IDC_COMMAND:
  33.             // Check to see if we have a change in the edit control
  34.             switch (GET_WM_COMMAND_CMD(wParam, lParam)) 
  35.             {
  36.             case EN_CHANGE:
  37.                 if (GetWindowTextLength(GetDlgItem(hDlg, IDC_COMMAND)) > 0)
  38.                     PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
  39.                 else
  40.                     PropSheet_SetWizButtons(GetParent(hDlg), 0);
  41.                 break;
  42.             }
  43.             break;
  44.             
  45.             case IDC_BROWSE: 
  46.                 {
  47.                     TCHAR szExt[80];
  48.                     TCHAR szFilter[80];
  49.                     TCHAR szTitle[80];
  50.                     TCHAR szFilename[MAX_PATH];
  51.                     int ret;
  52.                     LPTSTR lpsz = szFilter;
  53.                     
  54.                     // load the filter and then replace all the @ characters
  55.                     // with NULL.  The end of the string will be doubly
  56.                     // null-terminated
  57.                     LoadString(g_hinst, IDS_BROWSEFILTER, szFilter, ARRAYSIZE(szFilter)-1);
  58.                     while (*lpsz) {
  59.                         if (*lpsz == TEXT('@')) {
  60.                             *lpsz = 0;
  61.                             lpsz++;
  62.                         }
  63.                         else {
  64.                             lpsz = CharNext(lpsz);
  65.                         }
  66.                     }
  67.                     *(lpsz+1) = 0;
  68.                     
  69.                     LoadString(g_hinst, IDS_BROWSEEXT, szExt, ARRAYSIZE(szExt));
  70.                     LoadString(g_hinst, IDS_BROWSETITLE, szTitle, ARRAYSIZE(szTitle));
  71.                     
  72.                     GetDlgItemText(hDlg, IDC_COMMAND, lppi->szFilename, ARRAYSIZE(lppi->szFilename));
  73.                     
  74.                     // BUGBUG: Danger - this is a TCHAR API!
  75.                     // the code should be copied and pasted from shell32 and then pruned
  76.                     ret = GetFileNameFromBrowse(hDlg,szFilename, ARRAYSIZE(lppi->szFilename), NULL, szExt, szFilter, szTitle);
  77.                     if (ret > 0) 
  78.                     {
  79.                         lstrcpy(lppi->szFilename, szFilename);
  80.                     }
  81.                     
  82.                     SetDlgItemText(hDlg, IDC_COMMAND, lppi->szFilename);
  83.                     break;
  84.                 }
  85.         }
  86.         break;
  87.         
  88.         case WM_NOTIFY:
  89.             switch (((NMHDR *)lParam)->code) 
  90.             {
  91.             case PSN_KILLACTIVE:
  92.                 SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  93.                 return TRUE;
  94.                 
  95.             case PSN_RESET:
  96.                 // reset to original values
  97.                 *lppi->szFilename = TEXT('');
  98.                 SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  99.                 break;
  100.                 
  101.             case PSN_SETACTIVE:
  102.                 Edit_SetText(GetDlgItem(hDlg, IDC_COMMAND), lppi->szFilename);
  103.                 if (GetWindowTextLength(GetDlgItem(hDlg, IDC_COMMAND)) > 0)
  104.                     PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
  105.                 else
  106.                     PropSheet_SetWizButtons(GetParent(hDlg), 0);
  107.                 break;
  108.                 
  109.             case PSN_WIZNEXT:
  110.                 GetDlgItemText(hDlg, IDC_COMMAND, lppi->szFilename, ARRAYSIZE(lppi->szFilename));
  111.                 break;
  112.                 
  113.             case PSN_QUERYCANCEL:
  114.                 *lppi->szFilename = TEXT('');
  115.                 return FALSE;
  116.                 
  117.             default:
  118.                 return FALSE;
  119.             }
  120.             break;
  121.             
  122.             case WM_DESTROY:
  123.             case WM_HELP:
  124.             case WM_CONTEXTMENU:
  125.                 break;
  126.                 
  127.             default:
  128.                 return FALSE;
  129.                 
  130.     } // end of switch on uMsg
  131.     return TRUE;
  132. }  
  133. //
  134. // FUNCTION: PackWiz_SelectIconDlgProc(HWNDd, UINT, WPARAM, LPARAM)
  135. //
  136. // PURPOSE:  Dialog procedure for SECOND page of Create New Package Wizard
  137. // 
  138. //
  139. BOOL CALLBACK PackWiz_SelectIconDlgProc(HWND hDlg, UINT uMsg , WPARAM wParam, LPARAM lParam)
  140. {
  141.     LPPACKAGER_INFO lppi = (LPPACKAGER_INFO)GetWindowLong(hDlg, DWL_USER);
  142.     
  143.     switch (uMsg) 
  144.     {
  145.     case WM_INITDIALOG:
  146.         lppi = (LPPACKAGER_INFO)((LPPROPSHEETPAGE)lParam)->lParam;
  147.         SetWindowLong(hDlg, DWL_USER, (LONG)lppi);
  148.         *lppi->szIconPath = TEXT('');
  149.         lppi->iIcon = 0;
  150.         break;
  151.         
  152.     case WM_COMMAND:
  153.         switch (GET_WM_COMMAND_ID(wParam, lParam))
  154.         {
  155.         case IDHELP:
  156.             break;
  157.             
  158.         case IDC_CHANGEICON: 
  159.             {
  160.                 PickIconDlg(hDlg, lppi->szIconPath, ARRAYSIZE(lppi->szIconPath), &(lppi->iIcon));
  161.                 HICON hicon = ExtractAssociatedIcon(g_hinst, lppi->szIconPath, (LPWORD)&(lppi->iIcon));
  162.                 if (hicon) 
  163.                 {
  164.                     HWND hPackIcon = GetDlgItem(hDlg, IDC_PACKICON);
  165.                     SendMessage(hPackIcon, STM_SETICON, (WPARAM)hicon, (LPARAM)0);
  166.                 }
  167.             }
  168.             break;
  169.         }
  170.         break;
  171.         
  172.         case WM_NOTIFY:
  173.             switch (((NMHDR *)lParam)->code) 
  174.             {
  175.             case PSN_KILLACTIVE:
  176.                 SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  177.                 return TRUE;
  178.                 
  179.             case PSN_RESET:
  180.                 // reset to original values
  181.                 *lppi->szIconPath = TEXT('');
  182.                 lppi->iIcon = 0;
  183.                 SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  184.                 break;
  185.                 
  186.             case PSN_SETACTIVE: {
  187.                 HICON hicon;
  188.                 if (*lppi->szIconPath != TEXT(''))
  189.                     hicon = ExtractAssociatedIcon(g_hinst, lppi->szIconPath, (LPWORD)&(lppi->iIcon));
  190.                 else
  191.                     hicon = LoadIcon(g_hinst,MAKEINTRESOURCE(IDI_PACKAGER));
  192.                 
  193.                 HWND hPackIcon = GetDlgItem(hDlg, IDC_PACKICON);
  194.                 SendMessage(hPackIcon, STM_SETICON, (WPARAM)hicon, (LPARAM)0);
  195.                 
  196.                 PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_NEXT);
  197.                                 }
  198.                 break;
  199.                 
  200.             case PSN_WIZBACK:
  201.                 break;
  202.                 
  203.             case PSN_WIZNEXT:
  204.                 break;
  205.                 
  206.             case PSN_QUERYCANCEL:
  207.                 *lppi->szFilename = TEXT('');
  208.                 return FALSE;
  209.                 break;
  210.                 
  211.             default:
  212.                 return FALSE;
  213.             }
  214.             break;
  215.             
  216.             case WM_DESTROY:
  217.             case WM_HELP:
  218.             case WM_CONTEXTMENU:
  219.                 break;
  220.                 
  221.             default:
  222.                 return FALSE;
  223.                 
  224.     } // end of switch on uMsg
  225.     return TRUE;
  226. }  
  227. //
  228. // FUNCTION: PackWiz_SelectLabelDlgProc(HWND, UINT, WPARAM, LPARAM)
  229. //
  230. // PURPOSE:  Dialog procedure for THIRD page of Create New Package Wizard
  231. // 
  232. //
  233. BOOL CALLBACK PackWiz_SelectLabelDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  234. {
  235.     LPPACKAGER_INFO lppi = (LPPACKAGER_INFO)GetWindowLong(hDlg, DWL_USER);
  236.     
  237.     switch (uMsg) {
  238.         
  239.     case WM_INITDIALOG:
  240.         lppi = (LPPACKAGER_INFO)((LPPROPSHEETPAGE)lParam)->lParam;
  241.         SetWindowLong(hDlg, DWL_USER, (LONG)lppi);
  242.         Edit_LimitText(GetDlgItem(hDlg, IDC_COMMAND), ARRAYSIZE(lppi->szLabel) - 1);
  243.         GetDisplayName(lppi->szLabel,lppi->szFilename);
  244.         break;
  245.         
  246.     case WM_COMMAND:
  247.         switch (GET_WM_COMMAND_ID(wParam, lParam))
  248.         {
  249.         case IDHELP:
  250.             break;
  251.             
  252.         case IDC_COMMAND:
  253.             // Check to see if we have a change in the edit control
  254.     switch (GET_WM_COMMAND_CMD(wParam, lParam)) 
  255.             {
  256.             case EN_CHANGE:
  257.                 if (GetWindowTextLength(GetDlgItem(hDlg, IDC_COMMAND)) > 0)
  258.                     PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH);
  259.                 else
  260.                     PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
  261.                 break;
  262.             }
  263.             break;
  264.         }
  265.         break;
  266.         
  267.         case WM_NOTIFY:
  268.             switch (((NMHDR *)lParam)->code) 
  269.             {
  270.             case PSN_KILLACTIVE:
  271.                 SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  272.                 return TRUE;
  273.                 
  274.             case PSN_RESET:
  275.                 // reset to original values
  276.                 *lppi->szLabel = TEXT('');
  277.                 SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
  278.                 break;
  279.                 
  280.             case PSN_SETACTIVE:
  281.                 Edit_SetText(GetDlgItem(hDlg, IDC_COMMAND), lppi->szLabel);
  282.                 if (GetWindowTextLength(GetDlgItem(hDlg, IDC_COMMAND)) > 0)
  283.                     PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH);
  284.                 else
  285.                     PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
  286.                 break;
  287.                 
  288.             case PSN_WIZBACK:
  289.                 GetDlgItemText(hDlg, IDC_COMMAND, lppi->szLabel, ARRAYSIZE(lppi->szLabel));
  290.                 break;
  291.                 
  292.             case PSN_WIZFINISH:
  293.                 GetDlgItemText(hDlg, IDC_COMMAND, lppi->szLabel, ARRAYSIZE(lppi->szLabel));
  294.                 break;
  295.                 
  296.             case PSN_QUERYCANCEL:
  297.                 *lppi->szFilename = TEXT('');
  298.                 return FALSE;
  299.                 
  300.             default:
  301.                 return FALSE;
  302.             }
  303.             break;
  304.             
  305.             case WM_DESTROY:
  306.             case WM_HELP:
  307.             case WM_CONTEXTMENU:
  308.                 break;
  309.                 
  310.             default:
  311.                 return FALSE;
  312.                 
  313.     } // end of switch on uMsg
  314.     return TRUE;
  315. }
  316. //
  317. // FUNCTION: PackWiz_EditPackageDlgProc(HWND,UINT,WPARAM,LPARAM)
  318. //
  319. // PURPOSE:  Dialog procedure for Edit Package
  320. //
  321. // NOTE: We have two different types of packages we could edit, but they
  322. // both have exactly the same dialog layout, except for some static text, which
  323. // doesn't affect the dialog procedure
  324. // 
  325. //
  326. BOOL CALLBACK PackWiz_EditPackageDlgProc(HWND hDlg, UINT uMsg , WPARAM wParam, LPARAM lParam)
  327. {
  328.     LPPACKAGER_INFO lppi = (LPPACKAGER_INFO)GetWindowLong(hDlg, DWL_USER);
  329.     
  330.     switch (uMsg) {
  331.         
  332.     case WM_INITDIALOG: 
  333.         {
  334.             HICON hicon;
  335.             
  336.             lppi = (LPPACKAGER_INFO)lParam;
  337.             SetWindowLong(hDlg, DWL_USER, lParam);
  338.             Edit_LimitText(GetDlgItem(hDlg, IDC_EDIT1), ARRAYSIZE(lppi->szFilename) - 1);
  339.             Edit_LimitText(GetDlgItem(hDlg, IDC_EDIT2), ARRAYSIZE(lppi->szLabel) - 1);
  340.             SetDlgItemText(hDlg, IDC_EDIT1, lppi->szFilename);
  341.             SetDlgItemText(hDlg, IDC_EDIT2, lppi->szLabel);
  342.             
  343.             if (*lppi->szIconPath != TEXT(''))
  344.                 hicon = ExtractAssociatedIcon(g_hinst, lppi->szIconPath, (LPWORD)&(lppi->iIcon));
  345.             else
  346.                 hicon = LoadIcon(g_hinst,MAKEINTRESOURCE(IDI_PACKAGER));
  347.             
  348.             HWND hPackIcon = GetDlgItem(hDlg, IDC_PACKICON);
  349.             SendMessage(hPackIcon, STM_SETICON, (WPARAM)hicon, (LPARAM)0);
  350.             
  351.             break; 
  352.         }
  353.         
  354.     case WM_COMMAND:
  355.         switch (GET_WM_COMMAND_ID(wParam, lParam))
  356.         {
  357.         case IDHELP:
  358.             break;
  359.             
  360.         case IDOK:
  361.             GetDlgItemText(hDlg, IDC_EDIT1, lppi->szFilename, ARRAYSIZE(lppi->szFilename));
  362.             GetDlgItemText(hDlg, IDC_EDIT2, lppi->szLabel, ARRAYSIZE(lppi->szLabel));
  363.             EndDialog(hDlg, 1);
  364.             break;
  365.             
  366.         case IDCANCEL:
  367.             EndDialog(hDlg, -1);
  368.             break;
  369.             
  370.         case IDC_CHANGEICON: 
  371.             {
  372.                 PickIconDlg(hDlg, lppi->szIconPath, ARRAYSIZE(lppi->szIconPath), &(lppi->iIcon));
  373.                 HICON hicon = ExtractAssociatedIcon(g_hinst, lppi->szIconPath, (LPWORD)&(lppi->iIcon));
  374.             
  375.                 if (hicon) 
  376.                 {
  377.                     HWND hPackIcon = GetDlgItem(hDlg, IDC_PACKICON);
  378.                     SendMessage(hPackIcon, STM_SETICON, (WPARAM)hicon, (LPARAM)0);
  379.                 }
  380.             }
  381.             break;
  382.             
  383.         case IDC_BROWSE: 
  384.             {
  385.                 TCHAR szExt[80];
  386.                 TCHAR szFilter[80];
  387.                 TCHAR szTitle[80];
  388.                 LPTSTR lpsz = szFilter;
  389.             
  390.                 // load the filter and then replace all the @ characters
  391.                 // with NULL.  The end of the string will be doubly
  392.                 // null-terminated
  393.                 LoadString(g_hinst, IDS_BROWSEFILTER, szFilter, ARRAYSIZE(szFilter)-1);
  394.                 while (*lpsz) {
  395.                     if (*lpsz == TEXT('@')) {
  396.                         *lpsz = 0;
  397.                         lpsz++;
  398.                     }
  399.                     else {
  400.                         lpsz = CharNext(lpsz);
  401.                     }
  402.                 }
  403.                 *(lpsz+1) = 0;
  404.             
  405.                 LoadString(g_hinst, IDS_BROWSEEXT, szExt, ARRAYSIZE(szExt));
  406.                 LoadString(g_hinst, IDS_BROWSETITLE, szTitle, ARRAYSIZE(szTitle));
  407.             
  408.                 GetDlgItemText(hDlg, IDC_EDIT1, lppi->szFilename, ARRAYSIZE(lppi->szFilename));
  409.             
  410.                 GetFileNameFromBrowse(hDlg,lppi->szFilename,
  411.                     ARRAYSIZE(lppi->szFilename), NULL, szExt, szFilter, szTitle);
  412.             
  413.                 SetDlgItemText(hDlg, IDC_EDIT1, lppi->szFilename);
  414.             }
  415.             break;
  416.         }
  417.         break;
  418.         
  419.         case WM_DESTROY:
  420.         case WM_HELP:
  421.         case WM_CONTEXTMENU:
  422.             break;
  423.             
  424.         default:
  425.             return FALSE;
  426.             
  427.     } // end of switch on uMsg
  428.     return TRUE;
  429. }  
  430. //
  431. //
  432. // FUNCTION: PackWiz_FillInPropertyPage(PROPSHEETPAGE *, int, LPFN) 
  433. //
  434. // PURPOSE: Fills in the given PROPSHEETPAGE structure 
  435. //
  436. // COMMENTS:
  437. //
  438. //      This function fills in a PROPSHEETPAGE structure with the
  439. //      information the system needs to create the page.
  440. // 
  441. void PackWiz_FillInPropertyPage(PROPSHEETPAGE* psp, int idDlg, DLGPROC pfnDlgProc, LPPACKAGER_INFO lppi)
  442. {
  443.     psp->dwSize = sizeof(PROPSHEETPAGE);
  444.     psp->dwFlags = 0;
  445.     psp->hInstance = g_hinst;
  446.     psp->pszTemplate = MAKEINTRESOURCE(idDlg);
  447.     psp->pszIcon = NULL;
  448.     psp->pfnDlgProc = pfnDlgProc;
  449.     psp->pszTitle = NULL;
  450.     psp->lParam = (LPARAM)lppi;
  451. }
  452. //
  453. //
  454. // FUNCTION: PackWiz_CreateWizard(HWND)
  455. //
  456. // PURPOSE: Create the Wizard control. 
  457. //
  458. // COMMENTS:
  459. //
  460. //      This function creates the wizard property sheet.
  461. //
  462. int PackWiz_CreateWizard(HWND hwndOwner, LPPACKAGER_INFO lppi)
  463. {
  464.     PROPSHEETPAGE psp[PACKWIZ_NUM_PAGES];
  465.     PROPSHEETHEADER psh;
  466.     PackWiz_FillInPropertyPage(&psp[0], IDD_SELECTFILE, PackWiz_SelectFileDlgProc,lppi);
  467.     PackWiz_FillInPropertyPage(&psp[1], IDD_SELECTICON, PackWiz_SelectIconDlgProc,lppi);
  468.     PackWiz_FillInPropertyPage(&psp[2], IDD_SELECTLABEL, PackWiz_SelectLabelDlgProc,lppi);
  469.     
  470.     psh.dwSize = sizeof(PROPSHEETHEADER);
  471.     psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD;
  472.     psh.hwndParent = hwndOwner;
  473.     psh.nPages = ARRAYSIZE(psp);
  474.     psh.nStartPage = 0;
  475.     psh.pszIcon = NULL;
  476.     psh.ppsp = (LPCPROPSHEETPAGE) &psp;
  477.     return (PropertySheet(&psh));
  478. }
  479. //
  480. // FUNCTION: PackWiz_EditPackage(HWND, WORD, LPPACKAGER_INFO)
  481. //
  482. // PURPOSE:  To Run the Edit Package Dialog Procedure
  483. //
  484. //
  485. int PackWiz_EditPackage(HWND hwnd, WORD idDlg, LPPACKAGER_INFO lppi)
  486. {
  487.     return DialogBoxParam(g_hinst, MAKEINTRESOURCE(idDlg), hwnd, PackWiz_EditPackageDlgProc, (LPARAM)lppi);
  488. }