Цитата:
Сообщение от 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 - никак не узнать?