2025-04-27 07:49:33 -04:00

687 lines
17 KiB
C++

// **************************************************************************
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
// File: HMMSampDlg.cpp
//
// Description:
// This file implements the CAdvClientDlg dialog class which
// is the main dialog for the tutorial.
//
// History:
//
// **************************************************************************
#include "stdafx.h"
#include "AdvClient.h"
#include "AdvClientDlg.h"
#include "OnAsync.h"
#include "OnTemp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// **************************************************************************
//
// CAdvClientDlg::CAdvClientDlg()
//
// Description:
// Constructor for the main dialog. Puts the default namespace
// in the edit box and initializes variables.
// Parameters:
// pParent (in) - parent window.
//
// Returns:
// nothing.
//
// Globals accessed:
// None.
//
// Globals modified:
// None.
//
//===========================================================================
CAdvClientDlg::CAdvClientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAdvClientDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAdvClientDlg)
m_namespace = _T("\\\\.\\root\\cimv2");
//}}AFX_DATA_INIT
m_pIWbemServices = NULL;
m_pOfficeService = NULL;
m_pQueryCallback = NULL;
m_regPerm = TRUE;
m_regTemp = TRUE;
m_pEventSink = NULL;
}
// **************************************************************************
//
// CAdvClientDlg::~CAdvClientDlg()
//
// Description:
// Destructor. Releases COM interfaces for the dialog class.
// Parameters:
// None.
//
// Returns:
// nothing.
//
// Globals accessed:
// None.
//
// Globals modified:
// None.
//
//===========================================================================
CAdvClientDlg::~CAdvClientDlg()
{
// done with m_pQueryCallback sink.
if(m_pEventSink)
{
OnTempUnregister();
}
// done with m_pQueryCallback sink.
if(m_pQueryCallback)
{
m_pQueryCallback->Release();
delete m_pQueryCallback;
m_pQueryCallback = NULL;
}
// done with m_pIWbemServices.
if (m_pIWbemServices)
{
m_pIWbemServices->Release();
m_pIWbemServices = NULL;
}
// done with m_pIWbemServices.
if (m_pOfficeService)
{
m_pOfficeService->Release();
m_pOfficeService = NULL;
}
}
void CAdvClientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAdvClientDlg)
DDX_Control(pDX, IDC_DISK_PROPS_DESCRIPTIONS, m_diskDescriptions);
DDX_Control(pDX, IDC_EVENTLIST, m_eventList);
DDX_Control(pDX, IDC_REGPERM, m_perm);
DDX_Control(pDX, IDC_REGTEMP, m_temp);
DDX_Control(pDX, IDC_ADDEQUIPMENT, m_addEquipment);
DDX_Control(pDX, IDC_ENUMSERVICESASYNC, m_enumServicesAsync);
DDX_Control(pDX, IDC_ENUMSERVICES, m_enumServices);
DDX_Control(pDX, IDC_ENUMDISKS, m_enumDisks);
DDX_Control(pDX, IDC_DISKDETAILS, m_diskDetails);
DDX_Control(pDX, IDC_CONNECT, m_connect);
DDX_Control(pDX, IDC_OUTPUTLIST, m_outputList);
DDX_Text(pDX, IDC_NAMESPACE, m_namespace);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAdvClientDlg, CDialog)
//{{AFX_MSG_MAP(CAdvClientDlg)
ON_WM_SYSCOMMAND()
ON_BN_CLICKED(IDC_ADDEQUIPMENT, OnAddEquipment)
ON_BN_CLICKED(IDC_CONNECT, OnConnect)
ON_BN_CLICKED(IDC_ENUMDISKS, OnEnumdisks)
ON_BN_CLICKED(IDC_ENUMSERVICES, OnEnumservices)
ON_BN_CLICKED(IDC_ENUMSERVICESASYNC, OnEnumservicesasync)
ON_BN_CLICKED(IDC_DISKDETAILS, OnDiskdetails)
ON_BN_CLICKED(IDC_REGPERM, OnRegPerm)
ON_BN_CLICKED(IDC_REGTEMP, OnRegTemp)
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_DISK_PROPS_DESCRIPTIONS, OnDiskPropsDescriptions)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAdvClientDlg message handlers
BOOL CAdvClientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
//make scrollable horizontally by 5000 pixels
m_outputList.SetHorizontalExtent(5000);
return TRUE; // return TRUE unless you set the focus to a control
}
void CAdvClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// **************************************************************************
//
// ErrorString()
//
// Description:
// Converts an HRESULT to a displayable string.
//
// Parameters:
// hRes (in) - HRESULT to be converted.
//
// Returns:
// ptr to displayable string.
//
// Globals accessed:
// None.
//
// Globals modified:
// None.
//
//===========================================================================
LPCTSTR ErrorString(HRESULT hRes)
{
TCHAR szBuffer2[19];
static TCHAR szBuffer[24];
LPCTSTR psz;
switch(hRes)
{
case WBEM_NO_ERROR:
psz = _T("WBEM_NO_ERROR");
break;
case WBEM_S_FALSE:
psz = _T("WBEM_S_FALSE");
break;
case WBEM_S_NO_MORE_DATA:
psz = _T("WBEM_S_NO_MORE_DATA");
break;
case WBEM_E_FAILED:
psz = _T("WBEM_E_FAILED");
break;
case WBEM_E_NOT_FOUND:
psz = _T("WBEM_E_NOT_FOUND");
break;
case WBEM_E_ACCESS_DENIED:
psz = _T("WBEM_E_ACCESS_DENIED");
break;
case WBEM_E_PROVIDER_FAILURE:
psz = _T("WBEM_E_PROVIDER_FAILURE");
break;
case WBEM_E_TYPE_MISMATCH:
psz = _T("WBEM_E_TYPE_MISMATCH");
break;
case WBEM_E_OUT_OF_MEMORY:
psz = _T("WBEM_E_OUT_OF_MEMORY");
break;
case WBEM_E_INVALID_CONTEXT:
psz = _T("WBEM_E_INVALID_CONTEXT");
break;
case WBEM_E_INVALID_PARAMETER:
psz = _T("WBEM_E_INVALID_PARAMETER");
break;
case WBEM_E_NOT_AVAILABLE:
psz = _T("WBEM_E_NOT_AVAILABLE");
break;
case WBEM_E_CRITICAL_ERROR:
psz = _T("WBEM_E_CRITICAL_ERROR");
break;
case WBEM_E_INVALID_STREAM:
psz = _T("WBEM_E_INVALID_STREAM");
break;
case WBEM_E_NOT_SUPPORTED:
psz = _T("WBEM_E_NOT_SUPPORTED");
break;
case WBEM_E_INVALID_SUPERCLASS:
psz = _T("WBEM_E_INVALID_SUPERCLASS");
break;
case WBEM_E_INVALID_NAMESPACE:
psz = _T("WBEM_E_INVALID_NAMESPACE");
break;
case WBEM_E_INVALID_OBJECT:
psz = _T("WBEM_E_INVALID_OBJECT");
break;
case WBEM_E_INVALID_CLASS:
psz = _T("WBEM_E_INVALID_CLASS");
break;
case WBEM_E_PROVIDER_NOT_FOUND:
psz = _T("WBEM_E_PROVIDER_NOT_FOUND");
break;
case WBEM_E_INVALID_PROVIDER_REGISTRATION:
psz = _T("WBEM_E_INVALID_PROVIDER_REGISTRATION");
break;
case WBEM_E_PROVIDER_LOAD_FAILURE:
psz = _T("WBEM_E_PROVIDER_LOAD_FAILURE");
break;
case WBEM_E_INITIALIZATION_FAILURE:
psz = _T("WBEM_E_INITIALIZATION_FAILURE");
break;
case WBEM_E_TRANSPORT_FAILURE:
psz = _T("WBEM_E_TRANSPORT_FAILURE");
break;
case WBEM_E_INVALID_OPERATION:
psz = _T("WBEM_E_INVALID_OPERATION");
break;
case WBEM_E_INVALID_QUERY:
psz = _T("WBEM_E_INVALID_QUERY");
break;
case WBEM_E_INVALID_QUERY_TYPE:
psz = _T("WBEM_E_INVALID_QUERY_TYPE");
break;
case WBEM_E_ALREADY_EXISTS:
psz = _T("WBEM_E_ALREADY_EXISTS");
break;
case WBEM_S_ALREADY_EXISTS:
psz = _T("WBEM_S_ALREADY_EXISTS");
break;
case WBEM_S_RESET_TO_DEFAULT:
psz = _T("WBEM_S_RESET_TO_DEFAULT");
break;
case WBEM_S_DIFFERENT:
psz = _T("WBEM_S_DIFFERENT");
break;
case WBEM_E_OVERRIDE_NOT_ALLOWED:
psz = _T("WBEM_E_OVERRIDE_NOT_ALLOWED");
break;
case WBEM_E_PROPAGATED_QUALIFIER:
psz = _T("WBEM_E_PROPAGATED_QUALIFIER");
break;
case WBEM_E_PROPAGATED_PROPERTY:
psz = _T("WBEM_E_PROPAGATED_PROPERTY");
break;
case WBEM_E_UNEXPECTED:
psz = _T("WBEM_E_UNEXPECTED");
break;
case WBEM_E_ILLEGAL_OPERATION:
psz = _T("WBEM_E_ILLEGAL_OPERATION");
break;
case WBEM_E_CANNOT_BE_KEY:
psz = _T("WBEM_E_CANNOT_BE_KEY");
break;
case WBEM_E_INCOMPLETE_CLASS:
psz = _T("WBEM_E_INCOMPLETE_CLASS");
break;
case WBEM_E_INVALID_SYNTAX:
psz = _T("WBEM_E_INVALID_SYNTAX");
break;
case WBEM_E_NONDECORATED_OBJECT:
psz = _T("WBEM_E_NONDECORATED_OBJECT");
break;
case WBEM_E_READ_ONLY:
psz = _T("WBEM_E_READ_ONLY");
break;
case WBEM_E_PROVIDER_NOT_CAPABLE:
psz = _T("WBEM_E_PROVIDER_NOT_CAPABLE");
break;
case WBEM_E_CLASS_HAS_CHILDREN:
psz = _T("WBEM_E_CLASS_HAS_CHILDREN");
break;
case WBEM_E_CLASS_HAS_INSTANCES:
psz = _T("WBEM_E_CLASS_HAS_INSTANCES");
break;
case WBEM_E_QUERY_NOT_IMPLEMENTED:
psz = _T("WBEM_E_QUERY_NOT_IMPLEMENTED");
break;
case WBEM_E_ILLEGAL_NULL:
psz = _T("WBEM_E_ILLEGAL_NULL");
break;
case WBEM_E_INVALID_QUALIFIER_TYPE:
psz = _T("WBEM_E_INVALID_QUALIFIER_TYPE");
break;
case WBEM_E_INVALID_PROPERTY_TYPE:
psz = _T("WBEM_E_INVALID_PROPERTY_TYPE");
break;
case WBEM_E_VALUE_OUT_OF_RANGE:
psz = _T("WBEM_E_VALUE_OUT_OF_RANGE");
break;
case WBEM_E_CANNOT_BE_SINGLETON:
psz = _T("WBEM_E_CANNOT_BE_SINGLETON");
break;
default:
_itot(hRes, szBuffer2, 16);
_tcscat(szBuffer, szBuffer2);
psz = szBuffer;
break;
}
return psz;
}
// **************************************************************************
//
// ValueToString()
//
// Description:
// Converts a variant to a displayable string.
//
// Parameters:
// pValue (in) - variant to be converted.
// pbuf (out) - ptr to receive displayable string.
//
// Returns:
// Same as pbuf.
//
// Globals accessed:
// None.
//
// Globals modified:
// None.
//
//===========================================================================
#define BLOCKSIZE (32 * sizeof(WCHAR))
#define CVTBUFSIZE (309+40) /* # of digits in max. dp value + slop (this size stolen from cvt.h in c runtime library) */
LPWSTR ValueToString(VARIANT *pValue, WCHAR **pbuf)
{
DWORD iNeed = 0;
DWORD iVSize = 0;
DWORD iCurBufSize = 0;
WCHAR *vbuf = NULL;
WCHAR *buf = NULL;
switch (pValue->vt)
{
case VT_NULL:
buf = (WCHAR *)malloc(BLOCKSIZE);
wcscpy(buf, L"<null>");
break;
case VT_BOOL: {
VARIANT_BOOL b = pValue->boolVal;
buf = (WCHAR *)malloc(BLOCKSIZE);
if (!b) {
wcscpy(buf, L"FALSE");
} else {
wcscpy(buf, L"TRUE");
}
break;
}
case VT_UI1: {
BYTE b = pValue->bVal;
buf = (WCHAR *)malloc(BLOCKSIZE);
if (b >= 32) {
swprintf(buf, L"'%c' (%d, 0x%X)", b, b, b);
} else {
swprintf(buf, L"%d (0x%X)", b, b);
}
break;
}
case VT_I2: {
SHORT i = pValue->iVal;
buf = (WCHAR *)malloc(BLOCKSIZE);
swprintf(buf, L"%d (0x%X)", i, i);
break;
}
case VT_I4: {
LONG l = pValue->lVal;
buf = (WCHAR *)malloc(BLOCKSIZE);
swprintf(buf, L"%d (0x%X)", l, l);
break;
}
case VT_R4: {
float f = pValue->fltVal;
buf = (WCHAR *)malloc(CVTBUFSIZE * sizeof(WCHAR));
swprintf(buf, L"%10.4f", f);
break;
}
case VT_R8: {
double d = pValue->dblVal;
buf = (WCHAR *)malloc(CVTBUFSIZE * sizeof(WCHAR));
swprintf(buf, L"%10.4f", d);
break;
}
case VT_BSTR: {
LPWSTR pWStr = pValue->bstrVal;
buf = (WCHAR *)malloc((wcslen(pWStr) * sizeof(WCHAR)) + sizeof(WCHAR) + (2 * sizeof(WCHAR)));
swprintf(buf, L"\"%wS\"", pWStr);
break;
}
// the sample GUI is too simple to make it necessary to display
// these 'complicated' types--so ignore them.
case VT_DISPATCH: // Currently only used for embedded objects
case VT_BOOL|VT_ARRAY:
case VT_UI1|VT_ARRAY:
case VT_I2|VT_ARRAY:
case VT_I4|VT_ARRAY:
case VT_R4|VT_ARRAY:
case VT_R8|VT_ARRAY:
case VT_BSTR|VT_ARRAY:
case VT_DISPATCH | VT_ARRAY:
break;
default:
buf = (WCHAR *)malloc(BLOCKSIZE);
wcscpy(buf, L"<conversion error>");
}
*pbuf = buf;
return buf;
}
// **************************************************************************
//
// CAdvClientDlg::EnsureOfficeNamespace()
//
// Description:
// Returns a pointer to root\cimv2\office namespace; creating
// it if it doesn't already exist
// Parameters:
// None.
//
// Returns:
// COM interface to the namespace.
//
// Globals accessed:
// None.
//
// Globals modified:
// None.
//
//===========================================================================
BOOL CAdvClientDlg::EnsureOfficeNamespace(void)
{
IWbemClassObject *pNSClass = NULL;
IWbemClassObject *pNSInst = NULL;
BSTR Prop = NULL;
VARIANT v;
HRESULT hRes;
BSTR Namespace = SysAllocString(L"SAMPLE_Office");
// avoid getting another pointer if you already one. Potential
// leak if you do.
if(m_pOfficeService != NULL)
{
return TRUE;
}
// if 'Office' namespace doesnt exists...
if((hRes = m_pIWbemServices->OpenNamespace(Namespace, 0, NULL, &m_pOfficeService, NULL)) != S_OK)
{ // create it.
BSTR NamespaceClass = SysAllocString(L"__Namespace");
//-----------------------------------
// get the namespace class
if((hRes = m_pIWbemServices->GetObject(NamespaceClass,
0L, NULL,
&pNSClass,
NULL)) == S_OK)
{
//-----------------------------------
// spawn a new instance
if((hRes = pNSClass->SpawnInstance(0, &pNSInst)) == S_OK)
{
TRACE(_T("SpawnInstance() worked\n"));
// set the namespace's name.
VariantInit(&v);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = Namespace;
Prop = SysAllocString(L"Name");
pNSInst->Put(Prop, 0, &v, 0);
SysFreeString(Prop);
VariantClear(&v);
// create the instance.
hRes = m_pIWbemServices->PutInstance(pNSInst, 0, NULL, NULL);
pNSInst->Release();
pNSInst = NULL;
//-----------------------------------
// open the new namespace.
if((hRes = m_pIWbemServices->OpenNamespace(Namespace, 0, NULL, &m_pOfficeService, NULL)) != S_OK)
{
TRACE(_T("OpenNamespace() still failed: %s\n"), ErrorString(hRes));
} // endif OpenNamespace() again
}
else
{
TRACE(_T("SpawnInstance() failed: %s\n"), ErrorString(hRes));
} //endif SpawnInstance()
pNSClass->Release(); // Don't need the class any more
pNSClass = NULL;
}
SysFreeString(NamespaceClass);
} //endif OpenNamespace()
SysFreeString(Namespace);
// NOTE: The caller needs to Release() it.
return (m_pOfficeService != NULL);
}
//--------------------------------------------------------
BOOL CAdvClientDlg::CheckOfficeNamespace(void)
{
IWbemServices *pOfficeService = NULL;
HRESULT hRes;
BOOL itsThere = FALSE;
// lazy check first.
if(m_pOfficeService != NULL) return TRUE;
// do some real work now.
BSTR Namespace = SysAllocString(L"SAMPLE_Office");
// if 'Office' namespace doesnt exists...
if((hRes = m_pIWbemServices->OpenNamespace(Namespace, 0, NULL,
&pOfficeService, NULL)) == S_OK)
{
itsThere = TRUE;
pOfficeService->Release();
pOfficeService = NULL;
} //endif OpenNamespace()
SysFreeString(Namespace);
return itsThere;
}
//---------------------------------------------------------------
void CAdvClientDlg::OnCancel()
{
// make sure you unregister that sink.
if(m_pEventSink != NULL)
{
OnTempUnregister();
}
CDialog::OnCancel();
}