Jak określić, która wersja DirectX jest zainstalowana na komputerze?
Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy. |
Jak określić, która wersja DirectX jest zainstalowana na komputerze?
Cześć, Skrypciarze! Jak określić, która wersja DirectX jest zainstalowana na komputerze?
-- ML
Cześć, ML. Pytasz, jak określić, która wersja DirectX jest zainstalowana na komputerze. To ważne pytanie i za chwilę do niego przejdziemy. Jednak najpierw chcielibyśmy poruszyć jeszcze ważniejszą kwestię: ruchome piaski. Skrypciarz piszący te słowa dopiero niedawno dowiedział się, że w ruchomych piaskach nie sposób utonąć całkowicie, tak jak pokazują to w filmach. Ludzkie ciało ma mniejszą gęstość od ruchomych piasków, więc najgorsze co może nas spotkać, to utknięcie do pasa. Rzecz jasna, trudno się w takiej sytuacji uwolnić, więc można umrzeć z głodu, zostać zjedzonym przez lwa, albo coś w tym rodzaju.
Co ciekawe, w DirectX jest jeszcze łatwiej utknąć, niż w ruchomych piaskach. Jak wiadomo, informacja o numerze wersji DirectX znajduje się w rejestrze. Skrypciarze domyślali się nawet jej dokładnej lokalizacji (czyli HKEY_LOCAL_MACHINE\Software\Microsoft\DirectX). Nie byliśmy natomiast świadomi, w jakim formacie zapisana jest ta informacja; na naszym komputerze wartość ta wyglądała tak: 4.09.00.0904. Komputer jest dosyć nowy i z całą pewnością ma DirectX 9.x. Poczuliśmy więc, że wpadliśmy.
Koniec końców nie było jednak tak źle: aby określić wersję DirectX należy pobrać wartość z rejestru i przekształcić ją na format odpowiadający „prawdziwej” wersji DirectX. Tak się składa, że do tego właśnie służy poniższy skrypt:
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objRegistry=GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\DirectX"
strValueName = "Version"
objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
Select Case strValue
Case "4.02.0095"
strVersion = "1.0"
Case "4.03.00.1096"
strVersion = "2.0"
Case "4.04.0068"
strVersion = "3.0"
Case "4.04.0069"
strVersion = "3.0"
Case "4.05.00.0155"
strVersion = "5.0"
Case "4.05.01.1721"
strVersion = "5.0"
Case "4.05.01.1998"
strVersion = "5.0"
Case "4.06.02.0436"
strVersion = "6.0"
Case "4.07.00.0700"
strVersion = "7.0"
Case "4.07.00.0716"
strVersion = "7.0a"
Case "4.08.00.0400"
strVersion = "8.0"
Case "4.08.01.0881"
strVersion = "8.1"
Case "4.08.01.0810"
strVersion = "8.1"
Case "4.09.0000.0900"
strVersion = "9.0"
Case "4.09.00.0900"
strVersion = "9.0"
Case "4.09.0000.0901"
strVersion = "9.0a"
Case "4.09.00.0901"
strVersion = "9.0a"
Case "4.09.0000.0902"
strVersion = "9.0b"
Case "4.09.00.0902"
strVersion = "9.0b"
Case "4.09.00.0904"
strVersion = "9.0c"
Case "4.09.0000.0904"
strVersion = "9.0c"
End Select
Wscript.Echo strVersion
Nie przestraszcie się jego długości; większość kodu służy do przekształcenia możliwych wartości rejestru. Mechanizm jego działania jest natomiast bardzo prosty.
Jak bardzo? Otóż najpierw definiujemy stałą o nazwie HKEY_LOCAL_MACHINE, której wartość wynosi &H80000002; użyjemy jej, by poinstruować skrypt, z którą gałęzią rejestru należy się połączyć. Następnie za pomocą poniższego kodu łączymy się z usługą WMI komputera lokalnego:
strComputer = "."
Set objRegistry=GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
Podobnie jak większość skryptów WMI, tak i ten można bez problemy wykorzystać zdalnie. W jaki sposób? Wystarczy przypisać nazwę komputera zdalnego zmiennej strComputer. I tak np. poniższy fragment kodu połączy nas z usługą WMI na zdalnym komputerze atl-fs-01:
strComputer = "atl-fs-01"
Set objRegistry=GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
Uwaga. Wykonując połączenie należy pamiętać, by użyć przestrzeni nazw WMI root\default. Zazwyczaj skrypty WMI łączą się z przestrzenią root\cimv2. Tym razem jest inaczej z prostego powodu: klasa StdRegProv znajduje się w przestrzeni root\default. |
Po połączeniu przypisujemy wartości dwóm zmiennym. Zmiennej strKeyPath przypisujemy wartość odpowiadającą ścieżce w gałęzi rejestru HKEY_LOCAL_MACHINE; w naszym wypadku będzie to Software/Microsoft/DirectX. Jednocześnie zmienna strValueName otrzymuje wartość równą rzeczywistej wartości rejestru wewnątrz interesującego nas klucza odpowiadającego DirectX. W naszym skrypcie wartość ta to Version.
Po przypisaniu tych wartości wywołujemy metodę GetStringValue, która umożliwi nam odczytanie informacji o wersji DirectX:
objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
Nie ma tu nic skomplikowanego: po prostu wywołujemy metodę GetStringValue z następującymi parametrami: stałą HKEY_LOCAL_MACHINE; wejściowymi parametrami strKeyPath i strValueName; oraz parametrem wyjściowym strValue. O co chodzi z parametrami wejściowymi i wyjściowymi? Otóż parametr wejściowy to wartość, która zostanie użyta przez metodę. Natomiast parametr wyjściowy to wartość, którą metoda nam zwróci. Innymi słowy, podajemy metodzie GetStringValue nazwę zmiennej – strValue – a metoda GetStringValue przypisuje tej zmiennej wartość odczytaną w rejestrze. Na naszym komputerze testowym wykonanie metody GetStringValue spowodowało, ze wartośc strValue była równa 4.09.00.0904.
Rzecz jasna nie chcemy, aby wartość strValue wynosiła 4.09.00.0904; zależy nam na tym, aby odpowiadała ona rzeczywistej wersji DirectX (czyli w naszym wypadku 9.0c). Aby przekształcić 4.09.00.0904 na bardziej znajomy format użyjemy polecenia Select Case. Sprawdza ono wartość odczytaną z rejestru i zapisuje wartość odpowiadającą numerowi wersji w zmiennej strVersion. I tak, poniższy fragment kodu przekształca wartość 4.09.00.0904:
Case "4.09.00.0904"
strVersion = "9.0c"
Wystarczy teraz wyświetlić wartość zmiennej strVersion. Mówiliśmy, że nie jest to trudne.
Pozostaje jedno ważne pytanie: czy twórcy starych filmów o Tarzanie umyślnie nas oszukiwali, kiedy czarny charakter wpadał w ruchome piaski i powoli tonął? (Co ciekawe, ruchome piaski działają tylko na czarne charaktery; bohaterowie zawsze znajdują jakiś sposób, aby się wydostać. Poza tym, czarny charakter ginący w ruchomych piaskach musi być mężczyzną i musi nosić kapelusz, który jest wszystkim, co pozostaje na powierzchni.)
Szczerze mówiąc, nie wiemy. Tak czy inaczej, Skrypciarz piszący te słowa i tak jest im wdzięczny. W końcu to właśnie ze starych filmów przygodowych czerpie całą swoją wiedzę na temat geografii.
Do początku strony |