===[ Программизм / Linux ]=== #post-id: 7321-14-33 #original-date: 11.08.2020 Tue #original-time: 2:33 PM #original-day: 7321 #original-host: WinXP Home SP3 (Build 2600) WMI в Вайне – это что-то с чем-то! Прямо сейчас я пытаюсь приспособить работающий под виндой код к работе под вайном. Проблема настигла меня при работе с классом Win32_NetworkAdapterConfiguration. Некоторых свойств в Вайне нет, некоторые свойства возвращают не массивы строк, а массивы, в каждом элементе которого содержатся массив строк. При чём, судя по всему, это одинаковые массивы. Зачем? Почему? Нет ответа... #upd(11.08.2020 - 6:06 PM): Продолжаю атаковать WMI в Вайне. Только что всё сломалось, и класс Win32_NetworkAdapterConfiguration вообще перестал что-либо возвращать. Но это ладно. Выяснилось, что у меня в коде срабатывает обработчик ошибки, хотя для отладки я закоментировала обработку ошибок (то самое «On Error Resume Next»). Нигде выше ничего подобного нет, но программа не падает с сообщением от рантайма. Решила вписать «On Error GoTo 0», тоесть принудительно отключить обработку ошибок, всё начало падать, как и должно. Я не знаю, кто виноват, но в VB6 прогах в Вайне включен пропуск ошибок с самого начала, что явно не то, что ожидается. #upd(11.08.2020 - 6:24 PM): Происходит что-то странное. Теперь, при возникновении необработанной ошибки в VB6 программе под Вайном, рантайм выдаёт сообщение об ошибке и спокойно продолжает выполнение. Раньше оно хотя бы падало совсем, а теперь вот такие чудеса OO #upd(11.08.2020 - 6:57 PM): Похоже, проблема в WMI под Вайном. До обращений к нему обработка ошибок идёт в VB6 проге нормально. После – сходит с ума. #upd(11.08.2020 - 7:26 PM): Бугага. Оказывается, происходит следующее. После попытки перечислить объекты, возвращаемые запросом к WMI, устанавливается код ошибки, но самой ошибки не происходит. Иными словами, «On Error GoTo hError» не срабатывает, переход на метку не происходит. Но если сделать «Err.Number», то это свойство оказывается ненулевым (438, «Object doesn't support this property or method»). Вот тут и срабатывает обработчик ошибок. Если там же сделать что-то вроде «Err.Raise 51», то программа реально упадёт с сообщением от рантайма. В самом VB6 это случается, если, скажем, в какой-то функции перехватить ошибку, но не сделать Err.Clear. В таком случае код ошибки будет виден снаружи с тем же эффектом. Но, как правило, это не проблема, поскольку код ошибки снаружи проверяют только если она гарантировано передаётся наружу (например, полностью отключается перехват, либо после перехвата делают «Err.Raise» с новыми значениями), а если всё остаётся внутри, то и снаружи это не интересно. Вооот. Если не проверять код, то дальше WMI выдаёт информацию, но всё с теми же проблемами, с которыми я столкнулась ранее. Мне не понятно только одно: почему оно вдруг поломалось и даже после перезагрузки работает так и дальше. #upd(11.08.2020 - 10:48 PM): Странно. Очень странно. Допустим, есть свойство некоего WMI класса, которое возвращает массив строк (например, айпишники на данном интерфейсе). В Windows возвращается массив вариантов, в каждом из которых сидит строка. Перечисляется обычным For (по индексу или For Each). Тоесть в For пихаешь какой-нибудь Obj.IPAddress, и всё хорошо. Но под Вайном появляется нюанс. Там возвращается массив строк, при чём как-то хитро. Если в тот же For запихнуть Obj.IPAddress, то каждый элемент вернёт ещё один массив строк. При чём все массивы будут идентичны. Но если перед этим значение Obj.IPAddress присвоить какой-нибудь переменной, то туда попадает массив строк без выкрутасов. Я не знаю, что происходит, но у меня ощущение, что в старых версиях WMI (в Windows 98 и NT4) что-то подобное уже было.