Показать сообщение отдельно
  #7  
Старый 18.01.2017, 11:54
delphi-programmer-2007 delphi-programmer-2007 вне форума
Прохожий
 
Регистрация: 16.01.2017
Сообщения: 12
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
IDispatch - это один из базовых интерфейсов, как TObject для обычных классов. Т.е. что за реальный объект "прячется" за этим интерфейсом заранее неизвестно.
Можно попробовать простой workaround. В случае, если у тебя не получается получить значение, ты все равно возвращаешь 'NULL'. Ну так перехвати исключение в верни этот 'NULL'. Типа:
Код:
try
  s3 := GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard','SerialNumber')
except
  s3 := 'NULL'
end;


Вообще говоря, временно так и пришлось сделать - от безысходности.

Правда, сделал немного не так, а вот так:

Код:
try
  s3 := GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard','SerialNumber')
except
  on E:Exception do
    s3 := E.Message
end;

чтобы было более более информативно, чем в случае с 'NULL'.



Но это плохое решение. Вполне может получиться, что на некоторых компьютерах все четыре GetWMIString будут выдавать значение NULL и таким образом, теряется вообще смысл привязки программы к материнской плате и процессору. Кроме того, пользователь может поменять операционную систему (например, поменять Windows 7 на Windows 10) и может так получиться, что GetWMISTring будет уже другим для другой операционной системы ...

Хотелось бы все-таки по-нормальному решить проблему или хотя бы понять причину ошибки.

И понять, как вытащить этот SerialNumber, либо узнать, что он действительно NULL и его вытащить невозможно.

Ведь Dispatch-то какой-то есть и он явно не пустой. И явно что-то с ним можно сделать.

Только понять нужно, что с ним делать и что можно сделать. Понять, куда копать.

А так получается, только гадать можно (методом тыка, например) - какие методы могут быть у этого Dispatch - никак не узнать?
Ответить с цитированием