Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2013, 19:50   #1
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию WMI + Windows XP = Access violation at address ...

Здравствуйте. Есть код для получения названия OC, юзается WMI. При запуске на операционках Win7\win8 все работает прекрасно, но при запуске на win xp вылетает
Цитата:
Access violation at address 00570054 in module 'Project2.exe'. Write of address 5A732CB5.
сам код и место вылета (помечено красным)
Код:
  procedure GetParams;
  var
    Services : ISWbemServices;
    Locator : ISWbemLocator;
    ObjectSet : ISWbemObjectSet;
    Obj : ISWbemObject;
    varProp : oleVariant;
  begin
    Locator := CoSWbemLocator.Create();

    Services := Locator.ConnectServer('.','root\cimv2','','','','',0,nil);

    Locator := nil;

    {OperatingSystem}
    ObjectSet := Services.ExecQuery('select Caption from Win32_OperatingSystem', 'WQL',
                                    WbemScriptingMajorVersion and wbemFlagReturnImmediately, nil);

    obj := ObjectSet.ItemIndex(0); // Вот тут и вылетает access

    varProp := null;

    varProp := obj.Properties_.Item('Caption', 0);
    ShowMessage(VarToStr(varProp));
end;
К сожалению я не селен в работе с WMI, поэтому взял код из гугла. Подскажите что не так.
Спасибо!
bakanaev вне форума Ответить с цитированием
Старый 08.12.2013, 20:14   #2
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

А что бы WMI работал что вообще нужно? Может .NET Framework какой-то или еще что-то ?
bakanaev вне форума Ответить с цитированием
Старый 08.12.2013, 20:15   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ObjectSet нужно проверять
Код:
if not VarIsClear(ObjectSet ) then begin
    varProp := unassigned;
    varProp := obj.Properties_.Item('Caption', 0);
    if not VarIsClear(varProp) then
     ShowMessage(VarToStr(varProp));
end;
Иначе что-то пошло не так.
Цитата:
что бы WMI работал что вообще нужно?
Только библиотеку WMI и доступ к ее возможностям по безопасности.
I'm learning to live...

Последний раз редактировалось Stilet; 08.12.2013 в 20:29.
Stilet вне форума Ответить с цитированием
Старый 08.12.2013, 23:16   #4
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
ObjectSet нужно проверять
Код:
if not VarIsClear(ObjectSet ) then begin
    varProp := unassigned;
    varProp := obj.Properties_.Item('Caption', 0);
    if not VarIsClear(varProp) then
     ShowMessage(VarToStr(varProp));
end;
Иначе что-то пошло не так.
ObjectSet в порядке, код между begin и end выполняется, но опять же access

Может win xp не знает ISWbemObject? Или dll какую надо рядом положить с этим ISWbemObject ?
bakanaev вне форума Ответить с цитированием
Старый 09.12.2013, 00:05   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Стоп! А это зачем написал?: Locator := nil;
Цитата:
Может win xp не знает
Должен знать. WMI появилась еще в NT.
Цитата:
но опять же access
Чего-то ты не проверяешь. Могу попробовать посоветовать почитать мою статью
http://www.programmersclub.ru/wmi-w%...0%b9-%d1%87-1/
http://yandex.ru/clck/jsredir?from=y...65647621309537
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2013, 00:35   #6
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Stilet спасибо за помощь, и за статьи, но сделал так
Код:
 procedure GetParams;
  var
    Service:             ISWbemServices;
    ObjectSet:           ISWbemObjectSet;
    SObject:             ISWbemObject;
    PropSet:             ISWbemPropertySet;
    SProp:               ISWbemProperty;
    SWbemLocator1:        SWbemLocator;
    PropEnum, Enum:      IEnumVariant;
    TempObj:             OleVariant;
    Value:               Cardinal;
    StrValue:            string;

  begin
    SWbemLocator1 := CoSWbemLocator.Create();
    Service:= SWbemLocator1.ConnectServer('.', 'root\CIMV2', '', '', '',
        '', 0, nil);

    {BIOS}
    SObject:= Service.Get('Win32_BIOS', wbemFlagUseAmendedQualifiers, nil);
    ObjectSet:= SObject.Instances_(0, nil);
    Enum:= (ObjectSet._NewEnum) as IEnumVariant;
    Enum.Next(1, TempObj, Value);
    SObject:= IUnknown(TempObj) as SWBemObject;
    PropSet := SObject.Properties_;
    PropEnum := (PropSet._NewEnum) as IEnumVariant;
    while (PropEnum.Next(1, TempObj, Value) = S_OK) do
    begin
      SProp:= IUnknown(TempObj) as SWBemProperty;
      StrValue:= '';
      if SProp.Name = 'SerialNumber' then
      begin
        if SProp.Get_Value <> null then
          BIOSSerialNumber^ := SProp.Get_Value
        else
          BIOSSerialNumber^ := 'N/A';
      end;
    end;

    {Processor}
    SObject:= Service.Get('Win32_Processor', wbemFlagUseAmendedQualifiers, nil);
    ObjectSet:= SObject.Instances_(0, nil);
    Enum:= (ObjectSet._NewEnum) as IEnumVariant;
    Enum.Next(1, TempObj, Value);
    SObject:= IUnknown(TempObj) as SWBemObject;
    PropSet := SObject.Properties_;
    PropEnum := (PropSet._NewEnum) as IEnumVariant;
    while (PropEnum.Next(1, TempObj, Value) = S_OK) do
    begin
      SProp:= IUnknown(TempObj) as SWBemProperty;
      StrValue:= '';
      if SProp.Name = 'ProcessorId' then
      begin
        if SProp.Get_Value <> null then
          ProcessorProcessorId^ := SProp.Get_Value
        else
          ProcessorProcessorId^ := 'N/A';
      end;
    end;


    {BaseBoard}
    SObject:= Service.Get('Win32_BaseBoard', wbemFlagUseAmendedQualifiers, nil);
    ObjectSet:= SObject.Instances_(0, nil);
    Enum:= (ObjectSet._NewEnum) as IEnumVariant;
    Enum.Next(1, TempObj, Value);
    SObject:= IUnknown(TempObj) as SWBemObject;
    PropSet := SObject.Properties_;
    PropEnum := (PropSet._NewEnum) as IEnumVariant;
    while (PropEnum.Next(1, TempObj, Value) = S_OK) do
    begin
      SProp:= IUnknown(TempObj) as SWBemProperty;
      StrValue:= '';
      if SProp.Name = 'SerialNumber' then
      begin
        if SProp.Get_Value <> null then
          BaseBoardSerialNumber^ := SProp.Get_Value
        else
          BaseBoardSerialNumber^ := 'N/A';
      end;
    end;
  end;
Теперь работает и на XP
bakanaev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Arktos1995 Общие вопросы Delphi 5 12.12.2012 22:33
Access violation at address XXXXXX in module 'YYYYYY'. Read of address ZZZZZZ' nik-kang Помощь студентам 0 18.06.2012 22:22
Access violation at address 004733C4 in module 'loginin.exe'. Read of address 00000048' pavellyba Общие вопросы Delphi 2 18.08.2011 10:32
Access violation at address 00447E73 in modul Project.exe. Read of address 00000057. ArtGrek Общие вопросы Delphi 40 12.03.2011 22:03
Access violation at address 00478D0E in module 'Project1.exe'. Write of address 00000000 fondreykus-1 Общие вопросы Delphi 5 27.01.2010 14:25