Poszczególne nazwy monitorów wydajności mogą się różnić językiem, np. na jednym komputerze może być "% Processor Time" a na innym "Czas procesora (%)". Szukam sposobu żeby to obejść w jakiś sposób. Wyguglałem coś takiego http://stackoverflow.com/questions/5581859/retrieve-performance-counter-value-in-a-language-independent-way a konkretnie http://msdn.microsoft.com/en-us/library/aa372648(v=vs.85).aspx ale zielonego pojęcia nie mam jak tego używać w C#.. Wszelka pomoc będzie doceniona ;)
0
0
może streszczę te dwa artykuły:
Justin napisał(a)
The information linking PerfMon counters id's to both their US English name and their Localized name is stored in the registry in the following key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib
0
Albo ja się źle wyraziłem, albo Ty źle zrozumiałeś. Chodziło mi o to że nie wiem jak użyć funkcji PdhLookupPerfNameByIndex
w C#. Obecnie mam coś takiego:
[DllImport("pdh.dll")]
public static extern long PdhLookupPerfNameByIndexA(string szMachineName, long dwNameIndex, ref string szNameBuffer, long pcchNameBufferSize);
ale nie działa, tzn nie jest zwracana żadna nazwa przez referencję, a sama funkcja zwraca bardzo dużą liczbę, a z tego co się orientuję powinna zwrócić 0 (czyli brak błędów). Sygnaturę tej metody znalazłem tutaj http://www.vbforums.com/showthread.php?t=254718.
EDIT: Dobra już sobie poradziłem inaczej.
0
using System;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
enum PDH_STATUS:uint
{
PDH_CSTATUS_VALID_DATA = 0x00000000,
PDH_MORE_DATA = 0x800007d2,
PDH_INSUFFICIENT_BUFFER = 0xC0000bc2,
PDH_INVALID_ARGUMENT = 0xc0000bbd,
// wiele innych możliwych wartości...
}
[DllImport("pdh.dll", CharSet=CharSet.Unicode)]
static extern PDH_STATUS PdhLookupPerfNameByIndex(
string szMachineName,
uint dwNameIndex,
StringBuilder szNameBuffer,
ref uint pcchNameBufferSize
);
static void Main()
{
var buffer = new StringBuilder(1024); // bufor na zwracanego stringa
uint bufSize = (uint)buffer.Capacity; // zmienna przechowująca rozmiar bufora
PDH_STATUS status = PdhLookupPerfNameByIndex(null, 174, buffer, ref bufSize); // przykładowy index: 174
if (status == PDH_STATUS.PDH_CSTATUS_VALID_DATA)
{
// funkcja zwróciła nam napis w buforze, i jego długość do zmiennej bufSize
Console.WriteLine("zwrócono : {0}", buffer.ToString());
Console.WriteLine("długość : {0}", bufSize);
}
else if (status == PDH_STATUS.PDH_MORE_DATA ||
status == PDH_STATUS.PDH_INSUFFICIENT_BUFFER)
// bufor był za mały, w bufSize zwrócono potrzebny rozmiar
// teoretycznie nie powinno się zdarzyć, bo podane wyżej 1024 „musi” wystarczyć.
Console.WriteLine("potrzeba bufora na {0} znaków", bufSize);
else if (status == PDH_STATUS.PDH_INVALID_ARGUMENT)
Console.WriteLine("nieprawidłowy argument");
else
Console.WriteLine("nieznany błąd: 0x{0}", ((uint)status).ToString("x"));
}
}