// ************************************************************************** // 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""); 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""); } *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(); }