Wykrywanie wersji Windows i sprzętu.

0

Taki fragment kodu.. czy ktoś wie może dlaczego nie działa (w innym projekcie działa).

Złośliwym osobom problemami proponuję wyluzowanie się w innych miejscach do tego przeznaczonych.

uses
  ActiveX,
  ComObj;


function _GetWMIObject(const objectName: String): IDispatch;
var
  chEaten: Integer;
  BindCtx: IBindCtx;
  Moniker: IMoniker;
begin
  OleCheck(CreateBindCtx(0, BindCtx));
  OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten,
      Moniker));
  OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;

procedure Test;
var
  objWMIService: OLEVariant;
  colItems: OLEVariant;
  colItem: OLEVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;
  osVerInfo: TOSVersionInfo;
  W7: Boolean;

begin
  osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo) ;
  GetVersionEx(osVerInfo);
  W7 := (osVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (osVerInfo.dwMajorVersion > 5);
  objWMIService := _GetWMIObject('winmgmts:\\localhost\root\cimv2');
end;

// wywołanie
Test;

i w linii

objWMIService := _GetWMIObject('winmgmts:\\localhost\root\cimv2');

mam:

First chance exception at $7C812FD3. Exception class EOleSysError with message 'Nieprawidłowa składnia'. Process Projekt.exe (5740)

W pracy krokowej błąd wykazuje tu:

OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));

Pozdrawiam

3

Do wykrycia wersji potrzebujesz tylko GetVersionEx(osVerInfo);. GetWMIObject jest w ogóle nie potrzebne (chyba, że użyjesz tylko jego). Poza tym jeśli odpalasz program w trybie zgodności to GetVersionEx może nie zwrócić prawdziwej wersji tylko tą w jakim trybie zgodności odpaliłeś.

Do odpowiedzenia na pytanie "Czemu nie działa?" potrzeba informacji co chcesz zrobić. Zgodnie z tytułem chcesz znaleźć wersję, a napisałeś procedurę Test (oczekiwałbym raczej funkcji która zwraca string albo jakąś liczbę/enum).

Swoją drogą ten kod który wziąłeś stąd:
http://stackoverflow.com/questions/3447536/how-to-determine-the-os

zobacz jaka odpowiedź jest zaakceptowana

0

Do wcześniejszego projektu faktycznie kod mógł być pobrany z tej strony.
Do rozpoznania wersji Windows, potem do rozpoznania sprzętu.
Wstawiłem tylko fragment do momentu z błędem.

Dziękuję za podpowiedź, zrobię z wersją jako string.

Natomiast problem wynikał z tego, że klasa wywołana była bezpośrednio po initialization. Wywołanie wrzuciłem w timera i teraz jest ok.

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