home *** CD-ROM | disk | FTP | other *** search
- // RegisterControlsDlg.Cpp : implementation file
- //
-
- #include "StdAfx.H"
- #include "TestCon.H"
- #include "Resource.HM"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CRegisterControlsDlg dialog
-
-
- CRegisterControlsDlg::CRegisterControlsDlg( CWnd* pParent ) :
- CDialog( CRegisterControlsDlg::IDD, pParent )
- {
- //{{AFX_DATA_INIT(CRegisterControlsDlg)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- }
-
-
- void CRegisterControlsDlg::DoDataExchange( CDataExchange* pDX )
- {
- CDialog::DoDataExchange( pDX );
-
- //{{AFX_DATA_MAP(CRegisterControlsDlg)
- DDX_Control(pDX, IDC_REREGISTER, m_butReregister);
- DDX_Control(pDX, IDC_UNREGISTER, m_butUnregister);
- DDX_Control(pDX, IDC_REGISTEREDCONTROLS, m_lvRegisteredControls);
- //}}AFX_DATA_MAP
- }
-
-
- BEGIN_MESSAGE_MAP(CRegisterControlsDlg, CDialog)
- //{{AFX_MSG_MAP(CRegisterControlsDlg)
- ON_BN_CLICKED(IDC_UNREGISTER, OnUnregister)
- ON_NOTIFY(LVN_ITEMCHANGED, IDC_REGISTEREDCONTROLS, OnRegisteredControlsItemChanged)
- ON_BN_CLICKED(IDC_REREGISTER, OnReregister)
- ON_BN_CLICKED(IDC_REGISTER, OnRegister)
- ON_WM_HELPINFO()
- ON_WM_CONTEXTMENU()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CRegisterControlsDlg message handlers
-
- BOOL CRegisterControlsDlg::OnInitDialog()
- {
- CWaitCursor wait;
-
- CString strColumnTitle;
-
- CDialog::OnInitDialog();
-
- strColumnTitle.LoadString( IDS_PROGID );
- m_lvRegisteredControls.InsertColumn( 0, strColumnTitle, LVCFMT_LEFT, 200 );
- strColumnTitle.LoadString( IDS_PATH );
- m_lvRegisteredControls.InsertColumn( 1, strColumnTitle, LVCFMT_LEFT, 250 );
-
- RefreshRegisteredControls();
-
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
-
- static BOOL IsAControl( HKEY hkClass )
- {
- LONG lResult;
- HKEY hk;
-
- ASSERT( hkClass != NULL );
-
- lResult = RegOpenKeyEx( hkClass, _T( "InprocServer32" ), 0, KEY_READ, &hk );
- if( lResult != ERROR_SUCCESS )
- {
- // It doesn't have an inproc server, so it's probably not a control.
- return( FALSE );
- }
- RegCloseKey( hk );
-
- lResult = RegOpenKeyEx( hkClass, _T( "ProgID" ), 0, KEY_READ, &hk );
- if( lResult != ERROR_SUCCESS )
- {
- // It doesn't have a ProgID, so it's not a control.
- return( FALSE );
- }
- RegCloseKey( hk );
-
- lResult = RegOpenKeyEx( hkClass, _T( "Control" ), 0, KEY_READ, &hk );
- if( lResult == ERROR_SUCCESS )
- {
- // It's definitely a control.
- RegCloseKey( hk );
- return( TRUE );
- }
-
- lResult = RegOpenKeyEx( hkClass, _T( "ToolboxBitmap32" ), 0, KEY_READ,
- &hk );
- if( lResult == ERROR_SUCCESS )
- {
- // It's definitely a control.
- RegCloseKey( hk );
- return( TRUE );
- }
-
- return( FALSE );
- }
-
- void CRegisterControlsDlg::RefreshRegisteredControls()
- {
- HKEY hkCLSID;
- LONG lResult;
- DWORD iIndex;
- DWORD nSubkeyLength;
- FILETIME time;
- BOOL tStopEnumerating;
- DWORD dwType;
- DWORD nDataLength;
- TCHAR szProgID[80];
- TCHAR szInprocServer32[MAX_PATH];
- TCHAR szSubkey[MAX_PATH];
- HKEY hkSubkey;
- HKEY hkInprocServer32;
- HKEY hkProgID;
- int iItem;
-
- m_lvRegisteredControls.SetRedraw(FALSE);
- m_lvRegisteredControls.DeleteAllItems();
-
- lResult = RegOpenKeyEx( HKEY_CLASSES_ROOT, _T( "CLSID" ), 0, KEY_READ,
- &hkCLSID );
- if( lResult != ERROR_SUCCESS )
- {
- return;
- }
-
- iIndex = 0;
- tStopEnumerating = FALSE;
- while( !tStopEnumerating )
- {
- nSubkeyLength = sizeof( szSubkey )/sizeof( szSubkey[0] );
- lResult = RegEnumKeyEx( hkCLSID, iIndex, szSubkey, &nSubkeyLength, NULL,
- NULL, NULL, &time );
- if( lResult == ERROR_SUCCESS )
- {
- lResult = RegOpenKeyEx( hkCLSID, szSubkey, 0, KEY_READ, &hkSubkey );
- if( lResult == ERROR_SUCCESS )
- {
- if( IsAControl( hkSubkey ) )
- {
- lResult = RegOpenKeyEx( hkSubkey, _T( "InprocServer32" ), 0,
- KEY_READ, &hkInprocServer32 );
- if( lResult == ERROR_SUCCESS )
- {
- nDataLength = sizeof( szInprocServer32 );
- lResult = RegQueryValueEx( hkInprocServer32, NULL, NULL,
- &dwType, LPBYTE( szInprocServer32 ), &nDataLength );
- RegCloseKey( hkInprocServer32 );
- if( (lResult == ERROR_SUCCESS) && (dwType == REG_SZ) )
- {
- lResult = RegOpenKeyEx( hkSubkey, _T( "ProgID" ), 0,
- KEY_READ, &hkProgID );
- if( lResult == ERROR_SUCCESS )
- {
- nDataLength = sizeof( szProgID );
- lResult = RegQueryValueEx( hkProgID, NULL, NULL,
- &dwType, LPBYTE( szProgID ), &nDataLength );
- RegCloseKey( hkProgID );
- if( (lResult == ERROR_SUCCESS) && (dwType == REG_SZ) )
- {
- iItem = m_lvRegisteredControls.InsertItem( 0,
- szProgID );
- m_lvRegisteredControls.SetItemText( iItem, 0,
- szProgID );
- m_lvRegisteredControls.SetItemText( iItem, 1,
- szInprocServer32 );
- }
- }
- }
- }
- }
- }
- }
- else
- {
- tStopEnumerating = TRUE;
- }
- iIndex++;
- }
-
- m_lvRegisteredControls.SetRedraw(TRUE);
- m_lvRegisteredControls.Invalidate();
- UpdateButtons();
- }
-
- typedef HRESULT (STDAPICALLTYPE* PDLLREGISTERSERVER)( void );
- typedef HRESULT (STDAPICALLTYPE* PDLLUNREGISTERSERVER)( void );
-
- void CRegisterControlsDlg::OnUnregister()
- {
- CWaitCursor wait;
-
- UINT nSelectedItems;
- int iItem;
- CString strPath;
- HINSTANCE hLibrary;
- PDLLUNREGISTERSERVER pDllUnregisterServer;
- HRESULT hResult;
- int nResult;
-
- iItem = -1;
- nSelectedItems = m_lvRegisteredControls.GetSelectedCount();
- while( nSelectedItems > 0 )
- {
- iItem = m_lvRegisteredControls.GetNextItem( iItem, LVNI_SELECTED );
- ASSERT( iItem != -1 );
-
- strPath = m_lvRegisteredControls.GetItemText( iItem, 1 );
- TCTrace( TRACELEVEL_NORMAL, "Unregistering %s\n", LPCTSTR( strPath ) );
-
- hResult = S_OK;
-
- hLibrary = LoadLibrary( strPath );
- if( hLibrary == NULL )
- {
- TCTrace( TRACELEVEL_NORMAL, "Failed to load library %s.\n", LPCTSTR(
- strPath ) );
- hResult = E_FAIL;
- }
- else
- {
- pDllUnregisterServer = PDLLUNREGISTERSERVER( GetProcAddress( hLibrary,
- _T( "DllUnregisterServer" ) ) );
- if( pDllUnregisterServer == NULL )
- {
- TCTrace( TRACELEVEL_NORMAL,
- "Failed to get address of DllUnregisterServer.\n" );
- hResult = E_FAIL;
- }
- else
- {
- hResult = pDllUnregisterServer();
- if( FAILED( hResult ) )
- {
- TCTrace( TRACELEVEL_NORMAL,
- "DllUnregisterServer failed hResult = 0x%x.\n", hResult );
- }
- }
- FreeLibrary( hLibrary );
- }
-
- if( FAILED( hResult ) )
- {
- nResult = AfxMessageBox( IDS_UNREGISTERSERVERFAILED, MB_YESNO );
- if( nResult == IDYES )
- {
- }
- }
-
- nSelectedItems--;
- }
-
- RefreshRegisteredControls();
- }
-
- void CRegisterControlsDlg::UpdateButtons()
- {
- if( m_lvRegisteredControls.GetSelectedCount() > 0 )
- {
- m_butReregister.EnableWindow( TRUE );
- m_butUnregister.EnableWindow( TRUE );
- }
- else
- {
- m_butReregister.EnableWindow( FALSE );
- m_butUnregister.EnableWindow( FALSE );
- }
- }
-
- void CRegisterControlsDlg::OnRegisteredControlsItemChanged( NMHDR* pNMHDR,
- LRESULT* pResult )
- {
- (void)pNMHDR;
-
- UpdateButtons();
-
- *pResult = 0;
- }
-
- static void RegisterServer( LPCTSTR pszPathName )
- {
- HINSTANCE hLibrary;
- PDLLREGISTERSERVER pDllRegisterServer;
- HRESULT hResult;
-
- TCTrace( TRACELEVEL_NORMAL, "Registering %s\n", pszPathName );
- hLibrary = LoadLibrary( pszPathName );
- if( hLibrary == NULL )
- {
- TCTrace( TRACELEVEL_NORMAL, "Failed to load library %s.\n",
- pszPathName );
- }
- else
- {
- pDllRegisterServer = PDLLREGISTERSERVER( GetProcAddress( hLibrary, _T(
- "DllRegisterServer" ) ) );
- if( pDllRegisterServer == NULL )
- {
- TCTrace( TRACELEVEL_NORMAL,
- "Failed to get address of DllRegisterServer.\n" );
- }
- else
- {
- hResult = pDllRegisterServer();
- if( FAILED( hResult ) )
- {
- TCTrace( TRACELEVEL_NORMAL,
- "DllRegisterServer failed hResult = 0x%x.\n", hResult );
- }
- }
- FreeLibrary( hLibrary );
- }
- }
-
- void CRegisterControlsDlg::OnReregister()
- {
- CWaitCursor wait;
-
- UINT nSelectedItems;
- int iItem;
- CString strPath;
-
- iItem = -1;
- nSelectedItems = m_lvRegisteredControls.GetSelectedCount();
- while( nSelectedItems > 0 )
- {
- iItem = m_lvRegisteredControls.GetNextItem( iItem, LVNI_SELECTED );
- ASSERT( iItem != -1 );
- strPath = m_lvRegisteredControls.GetItemText( iItem, 1 );
- RegisterServer( strPath );
- nSelectedItems--;
- }
-
- RefreshRegisteredControls();
- }
-
- void CRegisterControlsDlg::OnRegister()
- {
- POSITION posPathName;
- CString strPathName;
- int nResult;
-
- CFileDialog dlg( TRUE, _T( "dll" ), NULL, OFN_HIDEREADONLY|
- OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT, _T(
- "ActiveX Controls|*.dll;*.ocx;*.ax||" ) );
-
- nResult = dlg.DoModal();
- if( nResult != IDOK )
- {
- return;
- }
-
- CWaitCursor wait;
-
- posPathName = dlg.GetStartPosition();
- while( posPathName != NULL )
- {
- strPathName = dlg.GetNextPathName( posPathName );
- RegisterServer( strPathName );
- }
-
- RefreshRegisteredControls();
- }
-
-
- static DWORD rgmapCHID[] =
- {
- IDC_REGISTEREDCONTROLS, HIDC_REGISTEREDCONTROLS,
- IDC_UNREGISTER, HIDC_UNREGISTER,
- IDC_REGISTER, HIDC_REGISTER,
- IDC_REREGISTER, HIDC_REREGISTER,
- 0, 0
- };
-
- BOOL CRegisterControlsDlg::OnHelpInfo( HELPINFO* pHelpInfo )
- {
- return( ::WinHelp( HWND( pHelpInfo->hItemHandle ),
- AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, DWORD( LPVOID(
- rgmapCHID ) ) ) );
- }
-
- void CRegisterControlsDlg::OnContextMenu( CWnd* pWnd, CPoint /* point */ )
- {
- ::WinHelp( HWND( *pWnd ), AfxGetApp()->m_pszHelpFilePath, HELP_CONTEXTMENU,
- DWORD( LPVOID( rgmapCHID ) ) );
- }
-