2025-11-28 00:35:46 +09:00

232 lines
6.3 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
#include "stdafx.h"
#include "VCExplore.h"
#include "CompImportDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IMPORT_TYPE_UNDEFINED -1
#define IMPORT_TYPE_PROGID 0
#define IMPORT_TYPE_CLSID 1
/////////////////////////////////////////////////////////////////////////////
// CCompImportDlg dialog
CCompImportDlg::CCompImportDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCompImportDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCompImportDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Load the dialogs icon resource
m_hIcon = AfxGetApp()->LoadIcon(IDI_IMPORT);
// Initialize the members
m_pCatalog = NULL;
m_nImportType = IMPORT_TYPE_UNDEFINED;
}
void CCompImportDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCompImportDlg)
DDX_Control(pDX, IDC_EDIT_COMPONENT, m_edtID);
DDX_Control(pDX, IDC_LABEL_COMPONENT, m_lblComponentDesc);
DDX_Control(pDX, IDC_COMBO_APPLICATION, m_cboApplications);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCompImportDlg, CDialog)
//{{AFX_MSG_MAP(CCompImportDlg)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_RADIO_CLSID, OnCLSID)
ON_BN_CLICKED(IDC_RADIO_PROG_ID, OnProgID)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCompImportDlg message handlers
void CCompImportDlg::set_Catalog(ICOMAdminCatalog *pCatalog)
{
// Only can have one Catalog object reference... release all prior references before assignment
ReleaseCatalog();
// Assign the new Catalog reference
m_pCatalog = pCatalog;
}
void CCompImportDlg::OnClose()
{
// Release the reference to the Catalog object if needed
ReleaseCatalog();
CDialog::OnClose();
}
void CCompImportDlg::ReleaseCatalog()
{
// Release the reference to the Catalog object if needed
if (NULL != m_pCatalog)
m_pCatalog->Release();
}
void CCompImportDlg::OnOK()
{
// Continue only if we have a valid Catalog pointer
if (NULL != m_pCatalog)
{
// Extract the method parameters from the UI
int nAppNameSize = m_cboApplications.GetWindowTextLength() + 1;
char* pAppNameBuf = new char[nAppNameSize];
m_cboApplications.GetWindowText(pAppNameBuf, nAppNameSize);
_bstr_t bstrAppName = pAppNameBuf;
delete [] pAppNameBuf;
int nIDSize = m_edtID.GetWindowTextLength() + 1;
char* pComponentNameBuf = new char[nIDSize];
m_edtID.GetWindowText(pComponentNameBuf, nIDSize);
_bstr_t bstrID = pComponentNameBuf;
delete [] pComponentNameBuf;
// Attempt to invoke the method
HRESULT hr = m_pCatalog->ImportComponent(bstrAppName,
bstrID);
// Report errors, if any
if FAILED(hr)
MessageBox("Failed to export the specified component.\n\nPress OK to continue.",
"Error",
(MB_OK | MB_ICONERROR));
}
else
MessageBox("Invalid Catalog reference.\n\nNo processing will be performed.\n\nPress OK to continue.",
"Error",
(MB_OK | MB_ICONERROR));
// Release the catalog reference
ReleaseCatalog();
CDialog::OnOK();
}
BOOL CCompImportDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the dialogs icon resources
SetIcon(m_hIcon, true); // 32x32 icon
SetIcon(m_hIcon, false); // 16x16 icon
// Select and set default export type
CheckRadioButton(IDC_RADIO_PROG_ID, IDC_RADIO_CLSID, IDC_RADIO_PROG_ID);
// Set the import type and description to match the current/default selection
OnProgID();
// Load the available applications
LoadAppCombo();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CCompImportDlg::OnCLSID()
{
// Set the import type....
m_nImportType = IMPORT_TYPE_CLSID;
//... and set the description to match the selection
m_lblComponentDesc.SetWindowText("CLSID:");
}
void CCompImportDlg::OnProgID()
{
// Set the import type....
m_nImportType = IMPORT_TYPE_PROGID;
//... and set the description to match the selection
m_lblComponentDesc.SetWindowText("ProgID:");
}
void CCompImportDlg::LoadAppCombo()
{
// Continue only if we have a valid Catalog pointer
if (NULL == m_pCatalog)
{
MessageBox("Invalid Catalog reference.\n\nNo processing will be performed.\n\nPress OK to continue.",
"Error",
(MB_OK | MB_ICONERROR));
return;
}
_bstr_t bstrAppCollection = "Applications";
ICatalogCollection* pAppCollection = NULL;
// Attempt to get a reference to the Catalog's "Application" collection
HRESULT hr = m_pCatalog->GetCollection(bstrAppCollection,
(IDispatch**) &pAppCollection);
if SUCCEEDED(hr)
{
// Attempt to populate the collection
hr = pAppCollection->Populate();
if SUCCEEDED(hr)
{
// Determine the number of items in the current collection
long lCount = 0;
hr = pAppCollection->get_Count(&lCount);
if SUCCEEDED(hr)
{
_variant_t vtItemName;
ICatalogObject* pCatalogObject = NULL;
// Enumerate through the objects in the current collection and
// populate the combo box
for (long lIndex = 0; lIndex < lCount; lIndex++)
{
hr = pAppCollection->get_Item(lIndex,
(IDispatch**) &pCatalogObject);
if SUCCEEDED(hr)
{
hr = pCatalogObject->get_Name(&vtItemName);
if SUCCEEDED(hr)
m_cboApplications.AddString(_bstr_t(vtItemName));
pCatalogObject->Release();
}
else
MessageBox("Error when attempting to get the current items name.\n\nPress OK to continue.",
"Error",
(MB_OK | MB_ICONERROR));
}
}
else
MessageBox("Failed to successfully determine the number of items in the Applications collection.\n\nNo processing will be performed.\n\nPress OK to continue.",
"Error",
(MB_OK | MB_ICONERROR));
}
else
MessageBox("Failed to successfully populate the Applications collection.\n\nNo processing will be performed.\n\nPress OK to continue.",
"Error",
(MB_OK | MB_ICONERROR));
}
else
MessageBox("Failed to get a reference to the Applications collection.\n\nNo processing will be performed.\n\nPress OK to continue.",
"Error",
(MB_OK | MB_ICONERROR));
}