|
|
// browsctr.cpp : implementation file
//
#include "stdafx.h"
#include "DPH_TEST.h"
#include "browsctr.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CBrowsCountersDlg dialog
CBrowsCountersDlg::CBrowsCountersDlg(CWnd* pParent /*=NULL*/, UINT nTemplate /* = IDD_BROWSE_COUNTERS_DLG_EXT */) : CDialog(nTemplate, pParent) { //{{AFX_DATA_INIT(CBrowsCountersDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// initialize the private/public variables here
wpLastMachineSel = 0;
cpeLastSelection.szMachineName = &cpeMachineName[0]; memset (cpeMachineName, 0, sizeof(cpeMachineName));
cpeLastSelection.szObjectName = &cpeObjectName[0]; memset (cpeObjectName, 0, sizeof(cpeObjectName));
cpeLastSelection.szInstanceName = &cpeInstanceName[0]; memset (cpeInstanceName, 0, sizeof(cpeInstanceName));
cpeLastSelection.szParentInstance = &cpeParentInstance[0]; memset (cpeParentInstance, 0, sizeof(cpeParentInstance));
cpeLastSelection.dwInstanceIndex = (DWORD)-1;
cpeLastSelection.szCounterName = &cpeCounterName[0]; memset (cpeCounterName, 0, sizeof(cpeCounterName));
memset (cpeLastPath, 0, sizeof(cpeLastPath));
bShowIndex = FALSE;
bSelectMultipleCounters = FALSE; bAddMultipleCounters = TRUE; bIncludeMachineInPath = FALSE;
szUsersPathBuffer = NULL; dwUsersPathBufferLength = 0; pCallBack = NULL; }
void CBrowsCountersDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBrowsCountersDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBrowsCountersDlg, CDialog) //{{AFX_MSG_MAP(CBrowsCountersDlg)
ON_CBN_SETFOCUS(IDC_MACHINE_COMBO, OnSetfocusMachineCombo) ON_CBN_KILLFOCUS(IDC_MACHINE_COMBO, OnKillfocusMachineCombo) ON_CBN_SELCHANGE(IDC_OBJECT_COMBO, OnSelchangeObjectCombo) ON_LBN_SELCHANGE(IDC_COUNTER_LIST, OnSelchangeCounterList) ON_LBN_SELCHANGE(IDC_INSTANCE_LIST, OnSelchangeInstanceList) ON_BN_CLICKED(IDC_USE_LOCAL_MACHINE, OnUseLocalMachine) ON_BN_CLICKED(IDC_SELECT_MACHINE, OnSelectMachine) ON_BN_CLICKED(IDC_ALL_INSTANCES, OnAllInstances) ON_BN_CLICKED(IDC_USE_INSTANCE_LIST, OnUseInstanceList) ON_BN_CLICKED(IDC_HELP, OnHelp) ON_BN_CLICKED(IDC_NETWORK, OnNetwork) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Utility Functions
#define MACHINE_LIST_SIZE 1024
#define OBJECT_LIST_SIZE 4096
#define COUNTER_LIST_SIZE 8192
#define INSTANCE_LIST_SIZE 8192
void CBrowsCountersDlg::LoadKnownMachines () { TCHAR mszMachineList[MACHINE_LIST_SIZE]; LPTSTR szThisMachine; DWORD dwLength; PDH_STATUS status;
HCURSOR hOldCursor;
hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT));
dwLength = MACHINE_LIST_SIZE; status = PdhEnumConnectedMachines ( &mszMachineList[0], &dwLength);
SendDlgItemMessage(IDC_MACHINE_COMBO, CB_RESETCONTENT);
if (status == ERROR_SUCCESS) { // update the combo box
for (szThisMachine = &mszMachineList[0]; *szThisMachine != 0; szThisMachine += lstrlen(szThisMachine)+1) { SendDlgItemMessage (IDC_MACHINE_COMBO, CB_ADDSTRING, 0, (LPARAM)szThisMachine); } SendDlgItemMessage (IDC_MACHINE_COMBO, CB_SETCURSEL); } ::SetCursor (hOldCursor); }
void CBrowsCountersDlg::LoadMachineObjects (BOOL bRefresh) { TCHAR szMachineName[MAX_PATH]; TCHAR szDefaultObject[MAX_PATH]; TCHAR mszObjectList[OBJECT_LIST_SIZE]; DWORD dwLength; LPTSTR szThisObject; HCURSOR hOldCursor;
hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT)); // get current machine name
(GetDlgItem(IDC_MACHINE_COMBO))->GetWindowText(szMachineName, MAX_PATH);
// get object list
dwLength = OBJECT_LIST_SIZE; PdhEnumObjects (szMachineName, mszObjectList, &dwLength, bRefresh);
// load object list
SendDlgItemMessage (IDC_OBJECT_COMBO, CB_RESETCONTENT);
for (szThisObject = &mszObjectList[0]; *szThisObject != 0; szThisObject += lstrlen(szThisObject) + 1) { SendDlgItemMessage (IDC_OBJECT_COMBO, CB_ADDSTRING, 0, (LPARAM)szThisObject); }
// get default Object
dwLength = MAX_PATH; PdhGetDefaultPerfObject ( szMachineName, szDefaultObject, &dwLength);
if (SendDlgItemMessage (IDC_OBJECT_COMBO, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)szDefaultObject) == CB_ERR) { // default object not found in list so select the first one
SendDlgItemMessage (IDC_OBJECT_COMBO, CB_SETCURSEL); } ::SetCursor (hOldCursor); }
void CBrowsCountersDlg::LoadCountersAndInstances () { TCHAR szMachineName[MAX_PATH]; TCHAR szObjectName[MAX_PATH]; TCHAR szDefaultCounter[MAX_PATH]; TCHAR mszCounterList[COUNTER_LIST_SIZE]; TCHAR mszInstanceList[INSTANCE_LIST_SIZE]; TCHAR szInstanceString[MAX_PATH]; LPTSTR szIndexStringPos; DWORD dwCounterLen; DWORD dwDefaultIndex; DWORD dwCounterListLength; DWORD dwInstanceListLength; DWORD dwInstanceMatch; DWORD dwInstanceIndex; LPTSTR szThisItem; CWnd *pcCounterListBox; CWnd *pcInstanceListBox; HCURSOR hOldCursor;
hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT));
// get current machine & object name
(GetDlgItem(IDC_MACHINE_COMBO))->GetWindowText(szMachineName, MAX_PATH); (GetDlgItem(IDC_OBJECT_COMBO))->GetWindowText(szObjectName, MAX_PATH);
// get object list
dwCounterListLength = sizeof(mszCounterList) / sizeof(TCHAR); dwInstanceListLength = sizeof(mszInstanceList) / sizeof(TCHAR); PdhEnumObjectItems ( szMachineName, szObjectName, mszCounterList, &dwCounterListLength, mszInstanceList, &dwInstanceListLength, 0);
//reset contents of both list boxes
pcCounterListBox = GetDlgItem (IDC_COUNTER_LIST); pcInstanceListBox = GetDlgItem (IDC_INSTANCE_LIST);
pcCounterListBox->SendMessage (LB_RESETCONTENT); pcInstanceListBox->SendMessage (LB_RESETCONTENT);
// now fill 'em up
// start with the counters
for (szThisItem = mszCounterList; *szThisItem != 0; szThisItem += lstrlen(szThisItem) + 1) { pcCounterListBox->SendMessage (LB_ADDSTRING, 0, (LPARAM)szThisItem); } dwCounterLen = MAX_PATH; PdhGetDefaultPerfCounter ( szMachineName, szObjectName, szDefaultCounter, &dwCounterLen);
dwDefaultIndex = pcCounterListBox->SendMessage (LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)szDefaultCounter); if (dwDefaultIndex == LB_ERR) { pcCounterListBox->SendMessage (LB_SETSEL, TRUE, 0); } else { pcCounterListBox->SendMessage (LB_SETSEL, TRUE, dwDefaultIndex); pcCounterListBox->SendMessage (LB_SETCARETINDEX, (WPARAM)dwDefaultIndex, MAKELPARAM(FALSE, 0)); }
// now the instance list
if (dwInstanceListLength > 0) { pcInstanceListBox->EnableWindow(TRUE); GetDlgItem(IDC_ALL_INSTANCES)->EnableWindow(TRUE); GetDlgItem(IDC_USE_INSTANCE_LIST)->EnableWindow(TRUE); for (szThisItem = mszInstanceList; *szThisItem != 0; szThisItem += lstrlen(szThisItem) + 1) { if (bShowIndex) { dwInstanceIndex = 0; dwInstanceMatch = (DWORD)-1; // find the index of this instance
lstrcpy (szInstanceString, szThisItem); lstrcat (szInstanceString, TEXT("#")); szIndexStringPos = &szInstanceString[lstrlen(szInstanceString)]; do { LongToString ((long)dwInstanceIndex++, szIndexStringPos, 10); dwInstanceMatch = (DWORD)SendDlgItemMessage (IDC_INSTANCE_LIST, LB_FINDSTRINGEXACT, (WPARAM)dwInstanceMatch, (LPARAM)szInstanceString); } while (dwInstanceMatch != LB_ERR); pcInstanceListBox->SendMessage (LB_ADDSTRING, 0, (LPARAM)szInstanceString); } else { pcInstanceListBox->SendMessage (LB_ADDSTRING, 0, (LPARAM)szThisItem); } } if (bWildCardInstances) { // disable instance list
pcInstanceListBox->EnableWindow(FALSE); } else { if (pcInstanceListBox->SendMessage (LB_GETCOUNT) != LB_ERR) { pcInstanceListBox->SendMessage (LB_SETSEL, TRUE, 0); } } } else { pcInstanceListBox->SendMessage (LB_ADDSTRING, 0, (LPARAM)TEXT("<No Instances>")); pcInstanceListBox->EnableWindow(FALSE); GetDlgItem(IDC_ALL_INSTANCES)->EnableWindow(FALSE); GetDlgItem(IDC_USE_INSTANCE_LIST)->EnableWindow(FALSE); } ::SetCursor (hOldCursor); }
void CBrowsCountersDlg::CompileSelectedCounters() { DWORD dwBufferRemaining;
DWORD dwCountCounters; DWORD dwThisCounter; DWORD dwCountInstances; DWORD dwThisInstance;
DWORD dwSize1, dwSize2;
PDH_COUNTER_PATH_ELEMENTS lszPath; TCHAR lszMachineName[MAX_PATH]; TCHAR lszObjectName[MAX_PATH]; TCHAR lszInstanceName[MAX_PATH]; TCHAR lszParentInstance[MAX_PATH]; TCHAR lszCounterName[MAX_PATH];
TCHAR szWorkBuffer[MAX_PATH]; LPTSTR szCounterStart;
CWnd *cwCounterList, *cwInstanceList;
// clear user's string
if (szUsersPathBuffer != NULL) { *szUsersPathBuffer = 0; dwBufferRemaining = dwUsersPathBufferLength; szCounterStart = szUsersPathBuffer; } else { return; // no point in continuing if user doesn't have a buffer
} // build base string using selected machine and object
if (bIncludeMachineInPath) { lszPath.szMachineName = &lszMachineName[0]; memset (lszMachineName, 0, sizeof(lszMachineName)); GetDlgItemText (IDC_MACHINE_COMBO, lszMachineName, MAX_PATH); } else { lszPath.szMachineName = NULL; }
lszPath.szObjectName = &lszObjectName[0]; memset (lszObjectName, 0, sizeof(lszObjectName)); GetDlgItemText (IDC_OBJECT_COMBO, lszObjectName, MAX_PATH);
cwCounterList = GetDlgItem (IDC_COUNTER_LIST); cwInstanceList = GetDlgItem (IDC_INSTANCE_LIST);
if (bSelectMultipleCounters) { if (bWildCardInstances) { lszPath.szInstanceName = &lszInstanceName[0]; memset (lszInstanceName, 0, sizeof(lszInstanceName)); lstrcpy (lszInstanceName, TEXT("*")); lszPath.szParentInstance = NULL; lszPath.dwInstanceIndex = (DWORD)-1;
dwSize1 = sizeof (szWorkBuffer) / sizeof (TCHAR); PdhMakeCounterPath (&lszPath, szWorkBuffer, &dwSize1, 0);
if ((dwSize1 + 1) < dwBufferRemaining) { // then this will fit so add it to the string
lstrcpy (szCounterStart, szWorkBuffer); szCounterStart += lstrlen(szWorkBuffer); *szCounterStart++ = 0; } } else { // get selected instances from list
dwCountCounters = cwCounterList->SendMessage (LB_GETCOUNT); for (dwThisCounter = 0; dwThisCounter < dwCountCounters; dwThisCounter++) { if (cwCounterList->SendMessage (LB_GETSEL, (WPARAM)dwThisCounter)) { lszPath.szCounterName = &lszCounterName[0]; memset (lszCounterName, 0, sizeof(lszCounterName)); cwCounterList->SendMessage (LB_GETTEXT, (WPARAM)dwThisCounter, (LPARAM)lszCounterName); if (cwInstanceList->IsWindowEnabled()) { dwCountInstances = cwInstanceList->SendMessage (LB_GETCOUNT); for (dwThisInstance = 0; dwThisInstance < dwCountInstances; dwThisInstance++) { if (cwInstanceList->SendMessage (LB_GETSEL, (WPARAM)dwThisInstance)) { lszPath.szInstanceName = &lszInstanceName[0]; memset (lszInstanceName, 0, sizeof(lszInstanceName)); cwInstanceList->SendMessage (LB_GETTEXT, (WPARAM)dwThisInstance, (LPARAM)lszInstanceName);
lszPath.szParentInstance = &lszParentInstance[0]; memset (lszParentInstance, 0, sizeof(lszParentInstance));
dwSize1 = dwSize2 = MAX_PATH; PdhParseInstanceName (lszInstanceName, lszInstanceName, &dwSize1, lszParentInstance, &dwSize2, &lszPath.dwInstanceIndex);
// parse instance name adds in the default index of one is
// not present. so if it's not wanted, this will remove it
if (!bShowIndex) lszPath.dwInstanceIndex = (DWORD)-1;
if (dwSize1 > 0) { lszPath.szInstanceName = &lszInstanceName[0]; } else { lszPath.szInstanceName = NULL; } if (dwSize2 > 0) { lszPath.szParentInstance = &lszParentInstance[0]; } else { lszPath.szParentInstance = NULL; }
dwSize1 = sizeof (szWorkBuffer) / sizeof (TCHAR); PdhMakeCounterPath (&lszPath, szWorkBuffer, &dwSize1, 0);
if ((dwSize1 + 1) < dwBufferRemaining) { // then this will fit so add it to the string
lstrcpy (szCounterStart, szWorkBuffer); szCounterStart += lstrlen(szWorkBuffer); *szCounterStart++ = 0; } } // end if instance is selected
} // end for each instance in list
} else { // this counter has no instances so process now
lszPath.szInstanceName = NULL; lszPath.szParentInstance = NULL; lszPath.dwInstanceIndex = (DWORD)-1;
dwSize1 = sizeof (szWorkBuffer) / sizeof (TCHAR); PdhMakeCounterPath (&lszPath, szWorkBuffer, &dwSize1, 0);
if ((dwSize1 + 1) < dwBufferRemaining) { // then this will fit so add it to the string
lstrcpy (szCounterStart, szWorkBuffer); szCounterStart += lstrlen(szWorkBuffer); *szCounterStart++ = 0; } } // end if counter has instances
} // else counter is not selected
} // end for each counter in list
} // end if not wild card instances
*szCounterStart++ = 0; // terminate MSZ
} else { // only single selections are allowed
// FIXFIX: add this code.
} }
////////////////////////////////////////////////////////////////////////////
// CBrowsCountersDlg message handlers
BOOL CBrowsCountersDlg::OnInitDialog() { HCURSOR hOldCursor;
hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT));
CDialog::OnInitDialog(); // limit text to machine name
(GetDlgItem(IDC_MACHINE_COMBO))->SendMessage(EM_LIMITTEXT, MAX_PATH);
// set check boxes to the caller defined setting
CheckRadioButton (IDC_USE_LOCAL_MACHINE, IDC_SELECT_MACHINE, (bIncludeMachineInPath ? IDC_SELECT_MACHINE : IDC_USE_LOCAL_MACHINE)); GetDlgItem(IDC_MACHINE_COMBO)->EnableWindow ( (bIncludeMachineInPath ? TRUE : FALSE)); CheckRadioButton (IDC_ALL_INSTANCES, IDC_USE_INSTANCE_LIST, IDC_USE_INSTANCE_LIST);
// set button text strings to reflect mode of dialog
if (bAddMultipleCounters) { (GetDlgItem(IDOK))->SetWindowText(TEXT("Add")); (GetDlgItem(IDCANCEL))->SetWindowText(TEXT("Close")); }
// connect to this machine
PdhConnectMachine(NULL); // Null is local machine
LoadKnownMachines(); // load machine list
LoadMachineObjects(TRUE); // load object list
LoadCountersAndInstances();
wpLastMachineSel = 0; ::SetCursor (hOldCursor);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CBrowsCountersDlg::OnOK() { HCURSOR hOldCursor;
hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT)); CompileSelectedCounters(); if (pCallBack != NULL) { (*pCallBack)(dwArg); } if (!bAddMultipleCounters) { CDialog::OnOK(); } ::SetCursor (hOldCursor); }
void CBrowsCountersDlg::OnCancel() { CDialog::OnCancel(); }
void CBrowsCountersDlg::OnSetfocusMachineCombo() { wpLastMachineSel = SendDlgItemMessage (IDC_MACHINE_COMBO, CB_GETCURSEL); }
void CBrowsCountersDlg::OnKillfocusMachineCombo() { TCHAR szNewMachineName[MAX_PATH]; CWnd *pcMachineCombo; long lMatchIndex; PDH_STATUS status; int mbStatus; HCURSOR hOldCursor;
hOldCursor = ::SetCursor (::LoadCursor (NULL, IDC_WAIT));
pcMachineCombo = GetDlgItem(IDC_MACHINE_COMBO);
// Get current combo box text
pcMachineCombo->GetWindowText (szNewMachineName, MAX_PATH); // see if it's in the combo box already
lMatchIndex = (long)pcMachineCombo->SendMessage ( CB_FINDSTRING,(WPARAM)-1, (LPARAM)szNewMachineName);
// if name is in list, then select it
if (lMatchIndex != CB_ERR) { // this name is already in the list so see if it's the same as the last selected machine
if (lstrcmpi (szNewMachineName, cpeMachineName) != 0) { // this is a different machine so update the display
pcMachineCombo->SendMessage (CB_SETCURSEL, (WPARAM)lMatchIndex); LoadMachineObjects (TRUE); LoadCountersAndInstances (); } } else { // not in list so try to add it
status = PdhConnectMachine (szNewMachineName); if (status == ERROR_SUCCESS) { // if successful, add string to combo box
lMatchIndex = pcMachineCombo->SendMessage (CB_ADDSTRING, 0, (LPARAM)szNewMachineName); pcMachineCombo->SendMessage (CB_SETCURSEL, (WPARAM)lMatchIndex); // update other fields
LoadMachineObjects (); // no need to update since it was just connected
LoadCountersAndInstances (); } else { mbStatus = MessageBox (TEXT("Unable to connect to machine"), NULL, MB_ICONEXCLAMATION | MB_TASKMODAL | MB_OKCANCEL); if (mbStatus == IDCANCEL) { GetDlgItem(IDC_MACHINE_COMBO)->SetFocus(); } else { pcMachineCombo->SendMessage (CB_SETCURSEL, wpLastMachineSel); } } } ::SetCursor (hOldCursor); }
void CBrowsCountersDlg::OnSelchangeObjectCombo() { LoadCountersAndInstances(); }
void CBrowsCountersDlg::OnSelchangeCounterList() { }
void CBrowsCountersDlg::OnSelchangeInstanceList() { }
void CBrowsCountersDlg::OnUseLocalMachine() { BOOL bMode;
bMode = !(BOOL)IsDlgButtonChecked(IDC_USE_LOCAL_MACHINE); GetDlgItem(IDC_MACHINE_COMBO)->EnableWindow(bMode); bIncludeMachineInPath = bMode; }
void CBrowsCountersDlg::OnSelectMachine() { BOOL bMode ;
bMode = (BOOL)IsDlgButtonChecked(IDC_SELECT_MACHINE); GetDlgItem(IDC_MACHINE_COMBO)->EnableWindow(bMode); bIncludeMachineInPath = bMode; }
void CBrowsCountersDlg::OnAllInstances() { BOOL bMode; CWnd *pInstanceList;
bMode = (BOOL)IsDlgButtonChecked(IDC_ALL_INSTANCES); pInstanceList = GetDlgItem(IDC_INSTANCE_LIST); // if "Sselect ALL" then clear list box selections and disable
if (bMode) { pInstanceList->SendMessage(LB_SETSEL, FALSE, (LPARAM)-1); } pInstanceList->EnableWindow(!bMode); bWildCardInstances = bMode; }
void CBrowsCountersDlg::OnUseInstanceList() { BOOL bMode; CWnd *pInstanceList;
bMode = (BOOL)IsDlgButtonChecked(IDC_USE_INSTANCE_LIST); pInstanceList = GetDlgItem(IDC_INSTANCE_LIST);
// enable list box and select 1st Instance
pInstanceList->EnableWindow(bMode); if (bMode) { if (pInstanceList->SendMessage(LB_GETCOUNT) > 0) { pInstanceList->SendMessage (LB_SETSEL, TRUE, 0); } } bWildCardInstances = !bMode; }
void CBrowsCountersDlg::OnHelp() {
}
void CBrowsCountersDlg::OnNetwork() {
}
|