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

  1. // RegisterControlsDlg.Cpp : implementation file
  2. //
  3.  
  4. #include "StdAfx.H"
  5. #include "TestCon.H"
  6. #include "Resource.HM"
  7.  
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13.  
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CRegisterControlsDlg dialog
  16.  
  17.  
  18. CRegisterControlsDlg::CRegisterControlsDlg( CWnd* pParent ) :
  19.    CDialog( CRegisterControlsDlg::IDD, pParent )
  20. {
  21.     //{{AFX_DATA_INIT(CRegisterControlsDlg)
  22.         // NOTE: the ClassWizard will add member initialization here
  23.     //}}AFX_DATA_INIT
  24. }
  25.  
  26.  
  27. void CRegisterControlsDlg::DoDataExchange( CDataExchange* pDX )
  28. {
  29.     CDialog::DoDataExchange( pDX );
  30.  
  31.     //{{AFX_DATA_MAP(CRegisterControlsDlg)
  32.     DDX_Control(pDX, IDC_REREGISTER, m_butReregister);
  33.     DDX_Control(pDX, IDC_UNREGISTER, m_butUnregister);
  34.     DDX_Control(pDX, IDC_REGISTEREDCONTROLS, m_lvRegisteredControls);
  35.     //}}AFX_DATA_MAP
  36. }
  37.  
  38.  
  39. BEGIN_MESSAGE_MAP(CRegisterControlsDlg, CDialog)
  40.     //{{AFX_MSG_MAP(CRegisterControlsDlg)
  41.     ON_BN_CLICKED(IDC_UNREGISTER, OnUnregister)
  42.     ON_NOTIFY(LVN_ITEMCHANGED, IDC_REGISTEREDCONTROLS, OnRegisteredControlsItemChanged)
  43.     ON_BN_CLICKED(IDC_REREGISTER, OnReregister)
  44.     ON_BN_CLICKED(IDC_REGISTER, OnRegister)
  45.     ON_WM_HELPINFO()
  46.     ON_WM_CONTEXTMENU()
  47.     //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49.  
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CRegisterControlsDlg message handlers
  52.  
  53. BOOL CRegisterControlsDlg::OnInitDialog()
  54. {
  55.    CWaitCursor wait;
  56.  
  57.    CString strColumnTitle;
  58.  
  59.    CDialog::OnInitDialog();
  60.  
  61.    strColumnTitle.LoadString( IDS_PROGID );
  62.    m_lvRegisteredControls.InsertColumn( 0, strColumnTitle, LVCFMT_LEFT, 200 );
  63.    strColumnTitle.LoadString( IDS_PATH );
  64.    m_lvRegisteredControls.InsertColumn( 1, strColumnTitle, LVCFMT_LEFT, 250 );
  65.  
  66.    RefreshRegisteredControls();
  67.  
  68.    return TRUE;  // return TRUE unless you set the focus to a control
  69.                   // EXCEPTION: OCX Property Pages should return FALSE
  70. }
  71.  
  72. static BOOL IsAControl( HKEY hkClass )
  73. {
  74.    LONG lResult;
  75.    HKEY hk;
  76.  
  77.    ASSERT( hkClass != NULL );
  78.  
  79.    lResult = RegOpenKeyEx( hkClass, _T( "InprocServer32" ), 0, KEY_READ, &hk );
  80.    if( lResult != ERROR_SUCCESS )
  81.    {
  82.       // It doesn't have an inproc server, so it's probably not a control.
  83.       return( FALSE );
  84.    }
  85.    RegCloseKey( hk );
  86.  
  87.    lResult = RegOpenKeyEx( hkClass, _T( "ProgID" ), 0, KEY_READ, &hk );
  88.    if( lResult != ERROR_SUCCESS )
  89.    {
  90.       // It doesn't have a ProgID, so it's not a control.
  91.       return( FALSE );
  92.    }
  93.    RegCloseKey( hk );
  94.  
  95.    lResult = RegOpenKeyEx( hkClass, _T( "Control" ), 0, KEY_READ, &hk );
  96.    if( lResult == ERROR_SUCCESS )
  97.    {
  98.       // It's definitely a control.
  99.       RegCloseKey( hk );
  100.       return( TRUE );
  101.    }
  102.  
  103.    lResult = RegOpenKeyEx( hkClass, _T( "ToolboxBitmap32" ), 0, KEY_READ,
  104.       &hk );
  105.    if( lResult == ERROR_SUCCESS )
  106.    {
  107.       // It's definitely a control.
  108.       RegCloseKey( hk );
  109.       return( TRUE );
  110.    }
  111.  
  112.    return( FALSE );
  113. }
  114.  
  115. void CRegisterControlsDlg::RefreshRegisteredControls()
  116. {
  117.    HKEY hkCLSID;
  118.    LONG lResult;
  119.    DWORD iIndex;
  120.    DWORD nSubkeyLength;
  121.    FILETIME time;
  122.    BOOL tStopEnumerating;
  123.    DWORD dwType;
  124.    DWORD nDataLength;
  125.    TCHAR szProgID[80];
  126.    TCHAR szInprocServer32[MAX_PATH];
  127.    TCHAR szSubkey[MAX_PATH];
  128.    HKEY hkSubkey;
  129.    HKEY hkInprocServer32;
  130.    HKEY hkProgID;
  131.    int iItem;
  132.  
  133.    m_lvRegisteredControls.SetRedraw(FALSE);
  134.    m_lvRegisteredControls.DeleteAllItems();
  135.  
  136.    lResult = RegOpenKeyEx( HKEY_CLASSES_ROOT, _T( "CLSID" ), 0, KEY_READ,
  137.       &hkCLSID );
  138.    if( lResult != ERROR_SUCCESS )
  139.    {
  140.       return;
  141.    }
  142.  
  143.    iIndex = 0;
  144.    tStopEnumerating = FALSE;
  145.    while( !tStopEnumerating )
  146.    {
  147.       nSubkeyLength = sizeof( szSubkey )/sizeof( szSubkey[0] );
  148.       lResult = RegEnumKeyEx( hkCLSID, iIndex, szSubkey, &nSubkeyLength, NULL,
  149.          NULL, NULL, &time );
  150.       if( lResult == ERROR_SUCCESS )
  151.       {
  152.          lResult = RegOpenKeyEx( hkCLSID, szSubkey, 0, KEY_READ, &hkSubkey );
  153.          if( lResult == ERROR_SUCCESS )
  154.          {
  155.             if( IsAControl( hkSubkey ) )
  156.             {
  157.                lResult = RegOpenKeyEx( hkSubkey, _T( "InprocServer32" ), 0,
  158.                   KEY_READ, &hkInprocServer32 );
  159.                if( lResult == ERROR_SUCCESS )
  160.                {
  161.                   nDataLength = sizeof( szInprocServer32 );
  162.                   lResult = RegQueryValueEx( hkInprocServer32, NULL, NULL,
  163.                      &dwType, LPBYTE( szInprocServer32 ), &nDataLength );
  164.                   RegCloseKey( hkInprocServer32 );
  165.                   if( (lResult == ERROR_SUCCESS) && (dwType == REG_SZ) )
  166.                   {
  167.                      lResult = RegOpenKeyEx( hkSubkey, _T( "ProgID" ), 0,
  168.                         KEY_READ, &hkProgID );
  169.                      if( lResult == ERROR_SUCCESS )
  170.                      {
  171.                         nDataLength = sizeof( szProgID );
  172.                         lResult = RegQueryValueEx( hkProgID, NULL, NULL,
  173.                            &dwType, LPBYTE( szProgID ), &nDataLength );
  174.                         RegCloseKey( hkProgID );
  175.                         if( (lResult == ERROR_SUCCESS) && (dwType == REG_SZ) )
  176.                         {
  177.                            iItem = m_lvRegisteredControls.InsertItem( 0,
  178.                               szProgID );
  179.                            m_lvRegisteredControls.SetItemText( iItem, 0,
  180.                               szProgID );
  181.                            m_lvRegisteredControls.SetItemText( iItem, 1,
  182.                               szInprocServer32 );
  183.                         }
  184.                      }
  185.                   }
  186.                }
  187.             }
  188.          }
  189.       }
  190.       else
  191.       {
  192.          tStopEnumerating = TRUE;
  193.       }
  194.       iIndex++;
  195.    }
  196.  
  197.    m_lvRegisteredControls.SetRedraw(TRUE);
  198.    m_lvRegisteredControls.Invalidate();
  199.    UpdateButtons();
  200. }
  201.  
  202. typedef HRESULT (STDAPICALLTYPE* PDLLREGISTERSERVER)( void );
  203. typedef HRESULT (STDAPICALLTYPE* PDLLUNREGISTERSERVER)( void );
  204.  
  205. void CRegisterControlsDlg::OnUnregister()
  206. {
  207.    CWaitCursor wait;
  208.  
  209.    UINT nSelectedItems;
  210.    int iItem;
  211.    CString strPath;
  212.    HINSTANCE hLibrary;
  213.    PDLLUNREGISTERSERVER pDllUnregisterServer;
  214.    HRESULT hResult;
  215.    int nResult;
  216.  
  217.    iItem = -1;
  218.    nSelectedItems = m_lvRegisteredControls.GetSelectedCount();
  219.    while( nSelectedItems > 0 )
  220.    {
  221.       iItem = m_lvRegisteredControls.GetNextItem( iItem, LVNI_SELECTED );
  222.       ASSERT( iItem != -1 );
  223.  
  224.       strPath = m_lvRegisteredControls.GetItemText( iItem, 1 );
  225.       TCTrace( TRACELEVEL_NORMAL, "Unregistering %s\n", LPCTSTR( strPath ) );
  226.  
  227.       hResult = S_OK;
  228.  
  229.       hLibrary = LoadLibrary( strPath );
  230.       if( hLibrary == NULL )
  231.       {
  232.          TCTrace( TRACELEVEL_NORMAL, "Failed to load library %s.\n", LPCTSTR(
  233.             strPath ) );
  234.          hResult = E_FAIL;
  235.       }
  236.       else
  237.       {
  238.          pDllUnregisterServer = PDLLUNREGISTERSERVER( GetProcAddress( hLibrary,
  239.             _T( "DllUnregisterServer" ) ) );
  240.          if( pDllUnregisterServer == NULL )
  241.          {
  242.             TCTrace( TRACELEVEL_NORMAL,
  243.                "Failed to get address of DllUnregisterServer.\n" );
  244.             hResult = E_FAIL;
  245.          }
  246.          else
  247.          {
  248.             hResult = pDllUnregisterServer();
  249.             if( FAILED( hResult ) )
  250.             {
  251.                TCTrace( TRACELEVEL_NORMAL,
  252.                   "DllUnregisterServer failed hResult = 0x%x.\n", hResult );
  253.             }
  254.          }
  255.          FreeLibrary( hLibrary );
  256.       }
  257.  
  258.       if( FAILED( hResult ) )
  259.       {
  260.          nResult = AfxMessageBox( IDS_UNREGISTERSERVERFAILED, MB_YESNO );
  261.          if( nResult == IDYES )
  262.          {
  263.          }
  264.       }
  265.  
  266.       nSelectedItems--;
  267.    }
  268.  
  269.    RefreshRegisteredControls();
  270. }
  271.  
  272. void CRegisterControlsDlg::UpdateButtons()
  273. {
  274.    if( m_lvRegisteredControls.GetSelectedCount() > 0 )
  275.    {
  276.       m_butReregister.EnableWindow( TRUE );
  277.       m_butUnregister.EnableWindow( TRUE );
  278.    }
  279.    else
  280.    {
  281.       m_butReregister.EnableWindow( FALSE );
  282.       m_butUnregister.EnableWindow( FALSE );
  283.    }
  284. }
  285.  
  286. void CRegisterControlsDlg::OnRegisteredControlsItemChanged( NMHDR* pNMHDR,
  287.    LRESULT* pResult )
  288. {
  289.    (void)pNMHDR;
  290.  
  291.    UpdateButtons();
  292.  
  293.     *pResult = 0;
  294. }
  295.  
  296. static void RegisterServer( LPCTSTR pszPathName )
  297. {
  298.    HINSTANCE hLibrary;
  299.    PDLLREGISTERSERVER pDllRegisterServer;
  300.    HRESULT hResult;
  301.  
  302.    TCTrace( TRACELEVEL_NORMAL, "Registering %s\n", pszPathName );
  303.    hLibrary = LoadLibrary( pszPathName );
  304.    if( hLibrary == NULL )
  305.    {
  306.       TCTrace( TRACELEVEL_NORMAL, "Failed to load library %s.\n",
  307.          pszPathName );
  308.    }
  309.    else
  310.    {
  311.       pDllRegisterServer = PDLLREGISTERSERVER( GetProcAddress( hLibrary, _T(
  312.          "DllRegisterServer" ) ) );
  313.       if( pDllRegisterServer == NULL )
  314.       {
  315.          TCTrace( TRACELEVEL_NORMAL,
  316.             "Failed to get address of DllRegisterServer.\n" );
  317.       }
  318.       else
  319.       {
  320.          hResult = pDllRegisterServer();
  321.          if( FAILED( hResult ) )
  322.          {
  323.             TCTrace( TRACELEVEL_NORMAL,
  324.                "DllRegisterServer failed hResult = 0x%x.\n", hResult );
  325.          }
  326.       }
  327.       FreeLibrary( hLibrary );
  328.    }
  329. }
  330.  
  331. void CRegisterControlsDlg::OnReregister()
  332. {
  333.    CWaitCursor wait;
  334.  
  335.    UINT nSelectedItems;
  336.    int iItem;
  337.    CString strPath;
  338.  
  339.    iItem = -1;
  340.    nSelectedItems = m_lvRegisteredControls.GetSelectedCount();
  341.    while( nSelectedItems > 0 )
  342.    {
  343.       iItem = m_lvRegisteredControls.GetNextItem( iItem, LVNI_SELECTED );
  344.       ASSERT( iItem != -1 );
  345.       strPath = m_lvRegisteredControls.GetItemText( iItem, 1 );
  346.       RegisterServer( strPath );
  347.       nSelectedItems--;
  348.    }
  349.  
  350.    RefreshRegisteredControls();
  351. }
  352.  
  353. void CRegisterControlsDlg::OnRegister()
  354. {
  355.    POSITION posPathName;
  356.    CString strPathName;
  357.    int nResult;
  358.  
  359.    CFileDialog dlg( TRUE, _T( "dll" ), NULL, OFN_HIDEREADONLY|
  360.       OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT, _T(
  361.       "ActiveX Controls|*.dll;*.ocx;*.ax||" ) );
  362.  
  363.    nResult = dlg.DoModal();
  364.    if( nResult != IDOK )
  365.    {
  366.       return;
  367.    }
  368.  
  369.    CWaitCursor wait;
  370.  
  371.    posPathName = dlg.GetStartPosition();
  372.    while( posPathName != NULL )
  373.    {
  374.       strPathName = dlg.GetNextPathName( posPathName );
  375.       RegisterServer( strPathName );
  376.    }
  377.  
  378.    RefreshRegisteredControls();
  379. }
  380.  
  381.  
  382. static DWORD rgmapCHID[] =
  383. {
  384.    IDC_REGISTEREDCONTROLS, HIDC_REGISTEREDCONTROLS,
  385.    IDC_UNREGISTER, HIDC_UNREGISTER,
  386.    IDC_REGISTER, HIDC_REGISTER,
  387.    IDC_REREGISTER, HIDC_REREGISTER,
  388.    0, 0
  389. };
  390.  
  391. BOOL CRegisterControlsDlg::OnHelpInfo( HELPINFO* pHelpInfo )
  392. {
  393.    return( ::WinHelp( HWND( pHelpInfo->hItemHandle ),
  394.       AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, DWORD( LPVOID(
  395.       rgmapCHID ) ) ) );
  396. }
  397.  
  398. void CRegisterControlsDlg::OnContextMenu( CWnd* pWnd, CPoint /* point */ )
  399. {
  400.    ::WinHelp( HWND( *pWnd ), AfxGetApp()->m_pszHelpFilePath, HELP_CONTEXTMENU,
  401.       DWORD( LPVOID( rgmapCHID ) ) );
  402. }
  403.