home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / ole / oleview / regview.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-27  |  16.9 KB  |  631 lines

  1. // regview.cpp : implementation file
  2. //
  3.  
  4. // This is a part of the Microsoft Foundation Classes C++ library.
  5. // Copyright (C) 1992-1998 Microsoft Corporation
  6. // All rights reserved.
  7. //
  8. // This source code is only intended as a supplement to the
  9. // Microsoft Foundation Classes Reference and related
  10. // electronic documentation provided with the library.
  11. // See these sources for detailed information regarding the
  12. // Microsoft Foundation Classes product.
  13.  
  14. #include "stdafx.h"
  15. #include "oleview.h"
  16. #include "regview.h"
  17.  
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char BASED_CODE THIS_FILE[] = __FILE__;
  21. #endif
  22.  
  23. BOOL RegToListBox( CTreeCtrl* pTree, const CString& strKey, HKEY hk, HTREEITEM htreeParent ) ;
  24. HICON GetIconFromReg( HKEY hk, LPTSTR szKey ) ;
  25.  
  26. int const MAX_KEYLEN    =   256 ;
  27. int const MAX_VALLEN    =   (_MAX_PATH + MAX_KEYLEN) ;
  28.  
  29. class CRegEntry
  30. {
  31. public:
  32.     CRegEntry( const CString& rstrKey,  const CString& rstrValue ) ;
  33.     virtual ~CRegEntry() ;
  34.  
  35. public:
  36.     CString     m_strKey ;
  37.     CString     m_strValue ;
  38.     TCHAR*      m_pszText ;
  39. } ;
  40.  
  41. CRegEntry::CRegEntry( const CString& rstrKey,  const CString& rstrValue )
  42. {
  43.     m_strKey = rstrKey ;
  44.     m_strValue = rstrValue ;
  45.     m_pszText = NULL ;
  46. }
  47.  
  48. CRegEntry::~CRegEntry( )
  49. {
  50.     if (m_pszText != NULL)
  51.         delete []m_pszText ;
  52.     m_pszText = NULL ;
  53. }
  54.  
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CRegistryView
  57.  
  58. IMPLEMENT_DYNCREATE(CRegistryView, CFormView)
  59.  
  60. CRegistryView::CRegistryView()
  61.     : CFormView(CRegistryView::IDD)
  62. {
  63.     //{{AFX_DATA_INIT(CRegistryView)
  64.     //}}AFX_DATA_INIT
  65. }
  66.  
  67. #ifdef _DEBUG
  68.  
  69. COle2ViewDoc* CRegistryView::GetDocument() // non-debug version is inline
  70. {
  71.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COle2ViewDoc)));
  72.     return (COle2ViewDoc*) m_pDocument;
  73. }
  74.  
  75. #endif //_DEBUG
  76.  
  77.  
  78. CRegistryView::~CRegistryView()
  79. {
  80. }
  81.  
  82. void CRegistryView::DoDataExchange(CDataExchange* pDX)
  83. {
  84.     CFormView::DoDataExchange(pDX);
  85.     //{{AFX_DATA_MAP(CRegistryView)
  86.     DDX_Control(pDX, IDC_OBJECTNAME, m_Name);
  87.     DDX_Control(pDX, IDC_OBJECTCLSID, m_CLSID);
  88.     DDX_Control(pDX, IDC_OBJICON, m_icon);
  89.     DDX_Control(pDX, IDC_TREEVIEW, m_tree);
  90.     //}}AFX_DATA_MAP
  91. }
  92.  
  93.  
  94. BEGIN_MESSAGE_MAP(CRegistryView, CFormView)
  95.     //{{AFX_MSG_MAP(CRegistryView)
  96.     ON_WM_SIZE()
  97.     ON_BN_CLICKED(IDC_UNREGISTER, OnUnregister)
  98.     ON_NOTIFY(TVN_ITEMEXPANDING, IDC_TREEVIEW, OnTreeViewItemExpanding)
  99.     ON_NOTIFY(TVN_GETDISPINFO, IDC_TREEVIEW, OnGetDispInfoTreeView)
  100.     ON_NOTIFY(TVN_SETDISPINFO, IDC_TREEVIEW, OnSetDispInfoTreeView)
  101.     ON_NOTIFY(TVN_DELETEITEM, IDC_TREEVIEW, OnDeleteItemTreeView)
  102.     //}}AFX_MSG_MAP
  103. END_MESSAGE_MAP()
  104.  
  105.  
  106.  
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CRegistryView diagnostics
  109.  
  110. #ifdef _DEBUG
  111. void CRegistryView::AssertValid() const
  112. {
  113.     CFormView::AssertValid();
  114. }
  115.  
  116. void CRegistryView::Dump(CDumpContext& dc) const
  117. {
  118.     CFormView::Dump(dc);
  119. }
  120. #endif //_DEBUG
  121.  
  122. /////////////////////////////////////////////////////////////////////////////
  123. // CRegistryView message handlers
  124.  
  125. void CRegistryView::OnSize(UINT nType, int cx, int cy)
  126. {
  127.     CFormView::OnSize(nType, cx, cy);
  128.  
  129.     if (m_tree.GetSafeHwnd())
  130.     {
  131.         CRect rc ;
  132.         m_tree.GetWindowRect( &rc ) ;
  133.         ScreenToClient( &rc ) ;
  134.         m_tree.SetWindowPos( NULL, 4, rc.top, cx-8, cy - rc.top - 4,
  135.                             SWP_NOACTIVATE|SWP_NOZORDER ) ;
  136.     }
  137. }
  138.  
  139. void CRegistryView::OnUnregister()
  140. {
  141.     // TODO: Add your control notification handler code here
  142.  
  143. }
  144.  
  145. void CRegistryView::OnInitialUpdate()
  146. {
  147.     CFormView::OnInitialUpdate();
  148.  
  149.     CRect rc ;
  150.     CRect rcClient ;
  151.     GetWindowRect( &rcClient ) ;
  152.     //GetParent()->ScreenToClient( &rcClient ) ;
  153.     m_tree.GetWindowRect( &rc ) ;
  154.     ScreenToClient( &rc ) ;
  155.  
  156.     if (g_osvi.dwMajorVersion < 4)
  157.     {
  158.         m_tree.SetFont( theApp.m_pFont ) ;
  159.         m_Name.SetFont( theApp.m_pFont ) ;
  160.         m_CLSID.SetFont( theApp.m_pFont ) ;
  161. //        m_btnUnReg.SetFont( theApp.m_pFont ) ;
  162.  
  163.         m_tree.SetWindowPos( NULL, 4, rc.top, rcClient.Width() - 10,
  164.                              rcClient.Height() - rc.top - 6,
  165.                              SWP_NOACTIVATE|SWP_NOREDRAW|SWP_NOZORDER ) ;
  166.     }
  167.     else
  168.     {
  169.         m_tree.SetWindowPos( NULL, 4, rc.top, rcClient.Width() - 8,
  170.                              rcClient.Height() - rc.top - 4,
  171.                              SWP_NOACTIVATE|SWP_NOREDRAW|SWP_NOZORDER ) ;
  172.     }
  173.     m_tree.SetFocus() ;
  174.  
  175.     m_tree.SetIndent( 0 ) ;
  176.  
  177.     SetScrollSizes( MM_TEXT, CSize(1,1) ) ;
  178. }
  179.  
  180. void CRegistryView::OnUpdate(CView* /* pSender */, LPARAM lHint, CObject* /*pHint*/)
  181. {
  182.     if (lHint & UPD_NOINTERFACEVIEW || lHint & UPD_NOOBJECTVIEW)
  183.         return ;
  184.  
  185.     COle2ViewDoc* pDoc = GetDocument() ;
  186.  
  187.     BeginWaitCursor() ;
  188.     m_tree.SetRedraw(FALSE) ;
  189.     m_tree.DeleteAllItems() ;
  190.     if (IsEqualCLSID( pDoc->m_clsidCur, CLSID_NULL ))
  191.     {
  192.         m_Name.SetWindowText("") ;
  193.         m_CLSID.SetWindowText("") ;
  194.         m_icon.SetIcon( theApp.LoadIcon( IDR_MAINFRAME ) ) ;
  195.         m_tree.SetRedraw(TRUE) ;
  196.         EndWaitCursor() ;
  197.         return ;
  198.     }
  199.  
  200.     // Fill the listbox with useful info about the class
  201.     //
  202.     HICON   hicon = NULL ;
  203.     HKEY    hk ;
  204.  
  205.     USES_CONVERSION;
  206.     OLECHAR szOleCLSID[64];
  207.     ::StringFromGUID2( pDoc->m_clsidCur, szOleCLSID,
  208.         sizeof(szOleCLSID)/sizeof(OLECHAR) ) ;
  209.     LPTSTR lpszCLSID = OLE2T(szOleCLSID);
  210.     m_CLSID.SetWindowText( lpszCLSID ) ;
  211.     m_Name.SetWindowText( pDoc->m_szObjectCur ) ;
  212.  
  213.     TCHAR           szKey[MAX_VALLEN] ;
  214.     TCHAR           szBuf[MAX_VALLEN] ;
  215.  
  216.     TV_INSERTSTRUCT tvis ;
  217.     tvis.hParent = TVI_ROOT ;
  218.     tvis.hInsertAfter = TVI_LAST ;
  219.     tvis.item.mask = TVIF_TEXT | TVIF_PARAM ;
  220.  
  221.     if (pDoc->m_fTypeLib)
  222.     {
  223.         // HKEY_CLASSES_ROOT\TypeLib\
  224.         wsprintf( szBuf, _T("TypeLib\\%s"), lpszCLSID ) ;
  225.         if (RegOpenKey( HKEY_CLASSES_ROOT, szBuf, &hk) == ERROR_SUCCESS)
  226.         {
  227.             LONG cb ;
  228.             cb = sizeof(szBuf) ;
  229.             RegQueryValue( HKEY_CLASSES_ROOT, (LPTSTR)_T("TypeLib"), szBuf, &cb) ;
  230.             tvis.hParent = TVI_ROOT ;
  231.             wsprintf(szKey, _T("%s = %s"), (LPCTSTR)_T("TypeLib"), (LPCTSTR)szBuf ) ;
  232.             tvis.item.pszText = szKey ;
  233.             tvis.item.lParam = (LPARAM)new CRegEntry( _T("TypeLib"), szBuf ) ;
  234.             HTREEITEM htree = m_tree.InsertItem( &tvis ) ;
  235.             RegToListBox( &m_tree, lpszCLSID, hk, htree ) ;
  236.             m_tree.Expand( htree, TVE_EXPAND ) ;
  237.             m_icon.SetIcon( theApp.LoadIcon( IDI_AUTOMATION ) ) ;
  238.  
  239.             RegCloseKey( hk ) ;
  240.         }
  241.         else
  242.             m_icon.SetIcon( theApp.LoadIcon( IDI_NOICON ) ) ;
  243.     }
  244.     else if (pDoc->m_fInterface)
  245.     {
  246.         // HKEY_CLASSES_ROOT\Interface\
  247.         wsprintf( szBuf, _T("Interface\\%s"), lpszCLSID ) ;
  248.         if (RegOpenKey( HKEY_CLASSES_ROOT, szBuf, &hk) == ERROR_SUCCESS)
  249.         {
  250.             LONG cb = sizeof(szBuf) ;
  251.             RegQueryValue( HKEY_CLASSES_ROOT, (LPTSTR)_T("Interface"), szBuf, &cb) ;
  252.  
  253.             tvis.hParent = TVI_ROOT ;
  254.             wsprintf(szKey, _T("%s = %s"), (LPCTSTR)_T("Interface"), (LPCTSTR)szBuf ) ;
  255.             tvis.item.pszText = szKey ;
  256.             tvis.item.lParam = (LPARAM)new CRegEntry( _T("Interface"), szBuf ) ;
  257.             HTREEITEM htree = m_tree.InsertItem( &tvis ) ;
  258.             RegToListBox( &m_tree, lpszCLSID, hk, htree ) ;
  259.             m_tree.Expand( htree, TVE_EXPAND ) ;
  260.  
  261.             cb = sizeof(szBuf) ;
  262.             if (RegQueryValue( hk, (LPTSTR)_T("BaseInterface"), szBuf, &cb) == ERROR_SUCCESS &&
  263.                 *szBuf != '\0')
  264.             {
  265.                 HKEY hk2 ;
  266.                 if (RegOpenKey( HKEY_CLASSES_ROOT, CString("Interface\\") + szBuf, &hk2) == ERROR_SUCCESS)
  267.                 {
  268.                     RegToListBox( &m_tree, szBuf, hk2, htree ) ;
  269.                     RegCloseKey( hk2 ) ;
  270.                 }
  271.             }
  272.  
  273.             cb = sizeof(szBuf) ;
  274.             if (RegQueryValue( hk, (LPTSTR)_T("ProxyStubClsid32"), szBuf, &cb) == ERROR_SUCCESS ||
  275.                 RegQueryValue( hk, (LPTSTR)_T("ProxyStubClsid"), szBuf, &cb) == ERROR_SUCCESS)
  276.             {
  277.                 cb = sizeof(szBuf) ;
  278.                 *szBuf = '\0' ;
  279.                 RegQueryValue( HKEY_CLASSES_ROOT, (LPTSTR)"CLSID", szBuf, &cb) ;
  280.                 wsprintf(szKey, _T("%s = %s"), (LPCTSTR)_T("CLSID"), (LPCTSTR)szBuf ) ;
  281.                 tvis.item.pszText = szKey ;
  282.                 tvis.item.lParam = (LPARAM)new CRegEntry( "CLSID", szBuf ) ;
  283.                 HTREEITEM htreeCLSID = m_tree.InsertItem( &tvis ) ;
  284.                 HKEY hk2 ;
  285.                 if (RegOpenKey( HKEY_CLASSES_ROOT, "CLSID", &hk2) == ERROR_SUCCESS)
  286.                 {
  287.                     cb = sizeof(szBuf) ;
  288.                     if (RegQueryValue( hk, (LPTSTR)_T("ProxyStubClsid32"), szBuf, &cb) == ERROR_SUCCESS)
  289.                     {
  290.                         HKEY hk3 ;
  291.                         if (RegOpenKey( hk2, szBuf, &hk3) == ERROR_SUCCESS)
  292.                             RegToListBox( &m_tree, szBuf, hk3, htreeCLSID ) ;
  293.                         RegCloseKey( hk3 ) ;
  294.                     }
  295.  
  296.                     cb = sizeof(szKey) ;
  297.                     if (RegQueryValue( hk, (LPTSTR)_T("ProxyStubClsid"), szKey, &cb) == ERROR_SUCCESS)
  298.                     {
  299.                         if (lstrcmpi(szKey,szBuf) != 0)
  300.                         {
  301.                             HKEY hk3 ;
  302.                             if (RegOpenKey( hk2, szKey, &hk3) == ERROR_SUCCESS)
  303.                                 RegToListBox( &m_tree, szKey, hk3, htreeCLSID ) ;
  304.                             RegCloseKey( hk3 ) ;
  305.                         }
  306.                     }
  307.  
  308.                     RegCloseKey( hk2 ) ;
  309.                 }
  310.                 m_tree.Expand( htreeCLSID, TVE_EXPAND ) ;
  311.             }
  312.  
  313.             cb = sizeof(szBuf) ;
  314.             if (RegQueryValue( hk, (LPTSTR)_T("TypeLib"), szBuf, &cb) == ERROR_SUCCESS)
  315.             {
  316.                 wsprintf(szKey, _T("%s = %s"), (LPCTSTR)_T("TypeLib"), (LPCTSTR)szBuf ) ;
  317.                 tvis.item.pszText = szKey ;
  318.                 tvis.item.lParam = (LPARAM)new CRegEntry( "TypeLib", szBuf ) ;
  319.                 htree = m_tree.InsertItem( &tvis ) ;
  320.  
  321.                 HKEY hk2 ;
  322.                 if (RegOpenKey( HKEY_CLASSES_ROOT, CString("TypeLib\\") + szBuf, &hk2) == ERROR_SUCCESS)
  323.                 {
  324.                     RegToListBox( &m_tree, szBuf, hk2, htree ) ;
  325.                     RegCloseKey( hk2 ) ;
  326.                 }
  327.                 m_tree.Expand( htree, TVE_EXPAND ) ;
  328.             }
  329.  
  330.             RegCloseKey( hk ) ;
  331.  
  332.             m_icon.SetIcon( theApp.LoadIcon( IDI_INTERFACE ) ) ;
  333.         }
  334.         else
  335.             m_icon.SetIcon( theApp.LoadIcon( IDI_NOICON ) ) ;
  336.     }
  337.     else
  338.     {
  339.         LONG cb = sizeof( szBuf );
  340.         *szBuf = '\0' ;
  341.         RegQueryValue( HKEY_CLASSES_ROOT, (LPTSTR)"CLSID", szBuf, &cb) ;
  342.         wsprintf(szKey, _T("%s = %s"), (LPCTSTR)_T("CLSID"), (LPCTSTR)szBuf ) ;
  343.         tvis.item.pszText = szKey ;
  344.         tvis.item.lParam = (LPARAM)new CRegEntry( "CLSID", szBuf) ;
  345.         HTREEITEM htreeCLSID = m_tree.InsertItem( &tvis ) ;
  346.  
  347.         wsprintf( szKey, _T("CLSID\\%s"), lpszCLSID ) ;
  348.         if (RegOpenKey( HKEY_CLASSES_ROOT, szKey, &hk) == ERROR_SUCCESS)
  349.         {
  350.             TCHAR    szValue[MAX_VALLEN] ;
  351.  
  352.             cb = sizeof( szBuf );
  353.             if (RegQueryValue( hk, (LPTSTR)_T("DefaultIcon"), szValue, &cb) == ERROR_SUCCESS)
  354.             {
  355.                 LPTSTR p ;
  356.                 int   nIndex = 0 ;
  357.  
  358.                 p = PointerToNthField( szValue, 2, ',' ) ;
  359.                 if (p && *p)
  360.                 {
  361.                     *(p-1) = '\0' ;
  362.                     nIndex = (int)*p - (int)'0' ;
  363.                 }
  364.                 if (*szValue == '"')
  365.                 {
  366.                     lstrcpy( szValue, szValue+1 ) ;
  367.                     p = strrchr( szValue, '"' ) ;
  368.                     if (p) *p = '\0' ;
  369.                 }
  370.                 hicon = ExtractIcon( AfxGetInstanceHandle(), szValue, nIndex ) ;
  371.             }
  372.  
  373.             if ((int)hicon <= 1)
  374.             {
  375.                 // try local server
  376.                 hicon = GetIconFromReg( hk, _T("LocalServer32") ) ;
  377.                 if ((int)hicon <= 1)
  378.                     hicon = GetIconFromReg( hk, _T("LocalServer") ) ;
  379.             }
  380.  
  381.             if ((int)hicon <= 1)
  382.             {
  383.                 // try inproc server
  384.                 hicon = GetIconFromReg( hk, _T("InprocServer32") ) ;
  385.                 if ((int)hicon <= 1)
  386.                     hicon = GetIconFromReg( hk, _T("InprocServer") ) ;
  387.             }
  388.  
  389.             if ((int)hicon <= 1)
  390.             {
  391.                 // try inproc handler
  392.                 hicon = GetIconFromReg( hk, _T("InprocHandler32") ) ;
  393.                 if ((int)hicon <= 1)
  394.                     hicon = GetIconFromReg( hk, _T("InprocHandler") ) ;
  395.             }
  396.  
  397.             // Now fill list box with all other stuff in the HKEY_CLASSES_ROOT\CLSID key
  398.             //
  399.             RegToListBox( &m_tree, lpszCLSID, hk, htreeCLSID ) ;
  400.             m_tree.Expand( htreeCLSID, TVE_EXPAND ) ;
  401.  
  402.             HKEY hkNext ;
  403.  
  404.             // HKEY_CLASSES_ROOT\ProgID\ key
  405.             cb = sizeof( szValue ) ;
  406.             if (RegQueryValue( hk, (LPTSTR)_T("ProgID"), szValue, &cb) != ERROR_SUCCESS)
  407.                 *szValue = '\0' ;
  408.             if (*szValue && (RegOpenKey( HKEY_CLASSES_ROOT, szValue, &hkNext) == ERROR_SUCCESS))
  409.             {
  410.                 cb = sizeof(szKey) ;
  411.                 RegToListBox( &m_tree, szValue, hkNext, TVI_ROOT ) ;
  412.  
  413.                 if ((int)hicon <= 1)
  414.                 {
  415.                     szBuf[0] = '\0' ;
  416.                     cb = sizeof(szBuf) ;
  417.                     if (RegQueryValue( hkNext, (LPTSTR)_T("Protocol\\StdFileEditing\\Server"), szBuf, &cb ) == ERROR_SUCCESS)
  418.                     {
  419.                         LPTSTR p ;
  420.                         if (*szBuf == '"')
  421.                         {
  422.                             lstrcpy( szBuf, szBuf+1 ) ;
  423.                             p = strrchr( szBuf, '"' ) ;
  424.                             if (p) *p = '\0' ;
  425.                         }
  426.  
  427.                         hicon = ExtractIcon( AfxGetInstanceHandle(), szBuf, 0 ) ;
  428.                     }
  429.  
  430.                 }
  431.  
  432.                 RegCloseKey( hkNext ) ;
  433.             }
  434.  
  435.             wsprintf( szBuf, _T("FileType\\%s"), lpszCLSID ) ;
  436.             if (lpszCLSID && (RegOpenKey( HKEY_CLASSES_ROOT, szBuf, &hkNext) == ERROR_SUCCESS))
  437.             {
  438.                 tvis.hParent = TVI_ROOT ;
  439.                 *szBuf = '\0' ;
  440.                 cb = sizeof(szBuf) ;
  441.                 RegQueryValue( HKEY_CLASSES_ROOT, (LPTSTR)"FileType", szBuf, &cb) ;
  442.                 wsprintf(szKey, _T("%s = %s"), (LPCTSTR)_T("FileType"), (LPCTSTR)szBuf ) ;
  443.                 tvis.item.pszText = szKey ;
  444.                 tvis.item.lParam = (LPARAM)new CRegEntry( "FileType", szBuf) ;
  445.                 HTREEITEM htree = m_tree.InsertItem( &tvis ) ;
  446.                 RegToListBox( &m_tree, lpszCLSID, hkNext, htree ) ;
  447.                 m_tree.Expand( htree, TVE_EXPAND ) ;
  448.                 RegCloseKey( hkNext ) ;
  449.             }
  450.  
  451.             // HKEY_CLASSES_ROOT\TypeLib\
  452.             cb = sizeof( szValue ) ;
  453.             if (RegQueryValue( hk, (LPTSTR)_T("TypeLib"), szValue, &cb) == ERROR_SUCCESS)
  454.             {
  455.                 wsprintf( szBuf, _T("TypeLib\\%s"), szValue ) ;
  456.                 if (RegOpenKey( HKEY_CLASSES_ROOT, szBuf, &hkNext) == ERROR_SUCCESS)
  457.                 {
  458.                     tvis.hParent = TVI_ROOT ;
  459.                     *szBuf = '\0' ;
  460.                     cb = sizeof(szBuf) ;
  461.                     RegQueryValue( HKEY_CLASSES_ROOT, (LPTSTR)"TypeLib", szBuf, &cb) ;
  462.  
  463.                     wsprintf(szKey, _T("%s = %s"), (LPCTSTR)_T("TypeLib"), (LPCTSTR)szBuf ) ;
  464.                     tvis.item.pszText = szKey ;
  465.                     tvis.item.lParam = (LPARAM)new CRegEntry( "TypeLib", szBuf) ;
  466.                     HTREEITEM htree = m_tree.InsertItem( &tvis ) ;
  467.                     RegToListBox( &m_tree, szValue, hkNext, htree ) ;
  468.                     m_tree.Expand( htree, TVE_EXPAND ) ;
  469.                     RegCloseKey( hkNext ) ;
  470.                 }
  471.             }
  472.  
  473.             RegCloseKey( hk ) ;
  474.  
  475.             if ((int)hicon > 1)
  476.                 m_icon.SetIcon( hicon ) ;
  477.             else
  478.                 m_icon.SetIcon( theApp.LoadIcon( IDI_NOICON ) ) ;
  479.  
  480.             m_tree.EnsureVisible( htreeCLSID ) ;
  481.         }
  482.     }
  483.  
  484.     m_tree.SetRedraw(TRUE) ;
  485.     EndWaitCursor() ;
  486.  
  487. }
  488.  
  489. BOOL RegToListBox( CTreeCtrl* pTree, const CString& strKey, HKEY hk, HTREEITEM htreeParent )
  490. {
  491.     TCHAR* szKey = NULL ;
  492.     TCHAR* szValue = NULL ;
  493.     TCHAR* szBuf = NULL ;
  494.     LONG  cb ;
  495.     DWORD dwIndex ;
  496.     BOOL  f = TRUE ;
  497.  
  498.     TRY
  499.     {
  500.         szKey = new TCHAR[MAX_KEYLEN] ;
  501.         szValue = new TCHAR[MAX_VALLEN] ;
  502.         szBuf = new TCHAR[MAX_VALLEN + 4] ;
  503.  
  504.         TV_INSERTSTRUCT tvis ;
  505.         tvis.hParent = htreeParent ;
  506.         tvis.hInsertAfter = TVI_LAST ;
  507.         tvis.item.mask = TVIF_TEXT | TVIF_PARAM ;
  508.  
  509.         cb = MAX_KEYLEN ;
  510.         RegQueryValue( hk, NULL, szValue, &cb) ;
  511.         wsprintf( szBuf, _T("%s = %s"), (LPCTSTR)strKey, (LPCTSTR)szValue ) ;
  512.         tvis.item.pszText = szBuf ;
  513.         tvis.item.lParam = (LPARAM)new CRegEntry( strKey, szValue ) ;
  514.         HTREEITEM htree = pTree->InsertItem( &tvis ) ;
  515.  
  516.         for ( dwIndex = 0 ;
  517.               RegEnumKey( hk, dwIndex, szKey, MAX_KEYLEN) == ERROR_SUCCESS ;
  518.               ++dwIndex )
  519.         {
  520.             cb = MAX_KEYLEN ;
  521.             *szValue = '\0' ;
  522.             RegQueryValue( hk, (LPTSTR)szKey, szValue, &cb) ;
  523.             HKEY hkNext ;
  524.             if (RegOpenKey( hk, szKey, &hkNext) == ERROR_SUCCESS)
  525.             {
  526.                 RegToListBox( pTree, szKey, hkNext, htree ) ;
  527.                 RegCloseKey( hkNext ) ;
  528.             }
  529.         }
  530.  
  531.         pTree->Expand( htree, TVE_EXPAND ) ;
  532.  
  533.         delete szKey ;
  534.         delete szValue ;
  535.         delete szBuf ;
  536.     }
  537.     CATCH(CException, pException)
  538.     {
  539.         if (szKey) delete [] szKey ;
  540.         if (szValue) delete [] szValue ;
  541.         if (szBuf) delete [] szBuf ;
  542.  
  543.         return FALSE ;
  544.     }
  545.     END_CATCH;
  546.  
  547.     return TRUE ;
  548. }
  549.  
  550. HICON GetIconFromReg( HKEY hk, LPTSTR szKey )
  551. {
  552.     TCHAR szValue[MAX_VALLEN] ;
  553.     LONG cb = MAX_VALLEN ;
  554.     if (RegQueryValue( hk, szKey, szValue, &cb) == ERROR_SUCCESS)
  555.     {
  556.         LPTSTR p = szValue + lstrlen( szValue ) - 1 ;
  557.         if (p && *p == ' ')
  558.             *p = '\0' ;
  559.         if (*szValue == '"')
  560.         {
  561.             lstrcpy( szValue, szValue+1 ) ;
  562.             p = strrchr( szValue, '"' ) ;
  563.             if (p) *p = '\0' ;
  564.         }
  565.  
  566.         return ExtractIcon( AfxGetInstanceHandle(), szValue, 0 ) ;
  567.     }
  568.     else
  569.         return (HICON)-1 ;
  570. }
  571.  
  572. void CRegistryView::OnTreeViewItemExpanding(NMHDR* pNMHDR, LRESULT* pResult)
  573. {
  574.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  575.  
  576.     if (pNMTreeView->action == TVE_COLLAPSE)
  577.         *pResult = 1 ; // prevent collapse
  578.     else
  579.         *pResult = 0 ;
  580. }
  581.  
  582. void CRegistryView::OnGetDispInfoTreeView(NMHDR* pNMHDR, LRESULT* pResult)
  583. {
  584.     TV_DISPINFO * pdispinfo = (TV_DISPINFO*)pNMHDR;
  585.  
  586. /*
  587.     CRegEntry* pentry = (CRegEntry*)pdispinfo->item.lParam ;
  588.     if (pentry)
  589.     {
  590.         //if (pentry->m_pszText)
  591.         //{
  592.         //    delete []pentry->m_pszText ;
  593.         //    pentry->m_pszText = NULL ;
  594.         //}
  595.         if (pdispinfo->item.mask & TVIF_TEXT)
  596.         {
  597.             if (pentry->m_pszText)
  598.                 pdispinfo->item.pszText = pentry->m_pszText ;
  599.             else
  600.             {
  601.                 pentry->m_pszText = new TCHAR[pentry->m_strKey.GetLength() + pentry->m_strKey.GetLength() + 4] ;
  602.                 wsprintf( pentry->m_pszText, _T("%s = %s"), (LPCTSTR)pentry->m_strKey, (LPCTSTR)pentry->m_strValue ) ;
  603.                 pdispinfo->item.pszText = pentry->m_pszText ;
  604.                 pdispinfo->item.mask = TVIF_TEXT ;
  605.             }
  606.         }
  607.     }
  608. */
  609.     *pResult = 0;
  610. }
  611.  
  612. void CRegistryView::OnSetDispInfoTreeView(NMHDR* pNMHDR, LRESULT* pResult)
  613. {
  614.     TV_DISPINFO * pdispinfo = (TV_DISPINFO*)pNMHDR;
  615.     // TODO: Add your control notification handler code here
  616.  
  617.     *pResult = 0;
  618. }
  619.  
  620. void CRegistryView::OnDeleteItemTreeView(NMHDR* pNMHDR, LRESULT* pResult)
  621. {
  622.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  623.  
  624.     if (pNMTreeView->itemOld.lParam)
  625.     {
  626.         delete (CRegEntry*)pNMTreeView->itemOld.lParam;
  627.     }
  628.  
  629.     *pResult = 0;
  630. }
  631.