Newsgroup: it.comp.lang.visual-basic
Titolo: Enumerare contatori PerfMon

Ho già posto questa domanda qualche settimana fa nel NG specifico alle API
ma non ci si sono nemmeno provati a rispondere. Chissà, forse quello che
chiedo é impossibile.
Mi servirebbe poter costruire una lista contenente tutti i contatori PerfMon
di un dato computer, con tutti gli oggetti, contatori e instanze.
Utilizzo phd.dll per accedere ai valori creando delle queries, ma devo
manualmente scegliere i contatori.
Ad esempio voglio scegliere tutti i processori, oppure i Physical Disks
esistenti.
Ringrazio anticipatamente
Salvatore

 e instanze.
Utilizza le funzioni PdhEnumObjects e PdhEnumObjectItems.
Ciao.

"H.P.L." <u...@vaila.ble> wrote in message
news:Djpp6.109605$Y93.2...@news.infostrada.it...

Yes, but.... tutte le referenze che ho trovato sono per VC++ dove io sono
"meno-meno"
Ho letto che ci sono certe parti della libreria PDH che sarebbero accesibili
solo con C++. Vero ?
Sono fregato o c'é ancora speranza?
Salvatore

 PDH che sarebbero accesibili solo con C++.
Sinceramente non l'ho mai utilizzata da VB e quindi non saprei dirti,
diciamo che lo trovo piuttosto strano. Sono molto poche le cose che non
sia possibile fare in VB.
Ora non ho purtroppo molto tempo per scriverti un esempio funzionante,
ma ti posso indicare la strada:
Const ERROR_SUCCESS = 0&
Const PDH_CSTATUS_NO_MACHINE As Long = &H800007D0
Const PDH_MORE_DATA As Long = &H800007D2
Const PDH_CSTATUS_NO_OBJECT As Long = &HC0000BB8
Const PDH_INVALID_ARGUMENT As Long = &HC0000BBD
Const PDH_INSUFFICIENT_BUFFER As Long = &HC0000BC2
Const PERF_DETAIL_NOVICE = 100         '// The uninformed can understand
it
Const PERF_DETAIL_ADVANCED = 200       '// For the advanced user
Const PERF_DETAIL_EXPERT = 300         '// For the expert user
Const PERF_DETAIL_WIZARD = 400         '// For the system designer
Declare Function PdhEnumObjects Lib "Pdh.dll" Alias "PdhEnumObjectsA"
(ByVal szDataSource As String, ByVal szMachineName As String, ByVal
mszObjectList As Long, ByRef pcchBufferLength As Long, ByVal
dwDetailLevel As Long, ByVal bRefresh As Boolean) As Long
Dim buffer() As Byte
Dim result As Long
Dim size As Long
size = 0
result = PdhEnumObjects(vbNullString, vbNullString, 0&, size,
PERF_DETAIL_NOVICE, False)
ReDim buffer(size)
result = PdhEnumObjects(vbNullString, vbNullString, VarPtr(buffer(0)),
size, PERF_DETAIL_NOVICE, False)
Select Case result
Case ERROR_SUCCESS
    Dim i As Integer
    Dim s() As String
    s = StrArrayFromByteArray(buffer)
    For i = 0 To UBound(s)
        Debug.Print s(i)
    Next
Case PDH_MORE_DATA
    MsgBox "More Data"
Case PDH_CSTATUS_NO_MACHINE
    MsgBox "No Machine"
Case PDH_CSTATUS_NO_OBJECT
    MsgBox "NoObject"
Case PDH_INVALID_ARGUMENT
    MsgBox "Invalid Argument"
Case PDH_INSUFFICIENT_BUFFER
    MsgBox "Insufficient Buffer"
End Select
Function StrArrayFromByteArray(ByVal buffer) As String()
    Dim tmp() As String
    ReDim tmp(1)
    Dim i As Integer, j As Integer
    For i = 0 To UBound(buffer)
        If (buffer(i) = 0) Then
            j = j + 1
            ReDim Preserve tmp(j)
        Else
            tmp(j) = tmp(j) + Chr(buffer(i))
        End If
    Next
    StrArrayFromByteArray = tmp
End Function
Ho scritto tutto in 5 minuti, quindi sicuramente il codice puo' essere
migliorato, comunque sotto Win2K Pro funziona correttamente.
Questo dovrebbe darti un'idea per fare cio' di cui hai bisogno.
Se hai altri dubbi chiedi.
Ciao.