Centrum skryptów - Systemy operacyjne

Jak określić, która wersja DirectX jest zainstalowana na komputerze?

Udostępnij na: Facebook

Cześć Skrypciarze!

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! Pytanie

Cześć, Skrypciarze! Jak określić, która wersja DirectX jest zainstalowana na komputerze?

-- ML

Cześć Skrypciarze! Odpowiedź

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 Do początku strony

Centrum skryptów - Systemy operacyjne