PerformanceCounter niezależny od języka

0

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1