| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > нестабильная работа WMI |
| Автор: Coder 17.2.2011, 04:24 | ||
| Здравствуйте! Решил рассчитывать ID на основе некоторой системной информации. Использую WMI, разбирался, как с ним работать вот по этой статье http://www.delphisources.ru/pages/faq/base/wmi_use.html Проблема в том, что обращение к WMI не всегда стабильно. Иногда программа висит, иногда вываливает AV. Но в 90% случаев все отрабатывается нормально. Вот весь код (проект на чистом WinAPI). ID считается в потоке, который запускается в самом начале выполнения программы. В чем может быть проблема?
|
| Автор: MetalFan 17.2.2011, 10:09 |
| мда... никакого контроля ошибок, или хотя бы на assigned возвращаемых интерфейсов... Добавь хотя бы примитивное логирование, тогда и будет видно, на чем вылетает. |
| Автор: cat512 17.2.2011, 14:13 |
| Не знаю, у меня никогда с wmi Access не вылетал, на некоторых запросах Wql, wmi тормозил серьёзно - это да, но Access-a никогда небыло. Кстати где Couninitialize? |
| Автор: Coder 17.2.2011, 15:25 | ||
| cat512, Вы можете показать свои примеры? На нем всегда и однозначно AV! Даже в пустом консольном приложении (я сейчас там разбираюсь с WMI). Привожу код. Переписал по примеру с сайта MS. извиняюсь, что не прикрепил файл. прокси не позволяет ) Значит так, пока не расставил везде вывод лога в файл один раз поймал тот самый AV. Расставил, запускаю, но поймать уже не могу )) AV проявляется так. Запускаю программу она подвисает на какой-то функции и AV...
|
| Автор: cat512 17.2.2011, 16:04 |
| Да, как только найду выложу. Наводящий вопрос: А будет ли AV если этот код выполнить в основном потоке? |
| Автор: Coder 18.2.2011, 01:40 | ||
Первый мой пример в отдельном потоке, второй в основном. Разницы нет, иногда выпадают.... Проверял на двух компьютерах с WinXP SP3. |
| Автор: northener 18.2.2011, 02:45 |
Стандартная судьба "копипастера". |
| Автор: Coder 18.2.2011, 03:41 |
Смотрите ниже я все переделал. |
| Автор: cat512 18.2.2011, 09:47 | ||
Вот часть кода из моих исходников, выполняется в основном потоке
Добавлено через 4 минуты и 27 секунд Когда то взял себе за правило- с COM всегда работать через описания интерфейсов (не используя vcl-враперы TOleServer) |
| Автор: Coder 18.2.2011, 15:50 |
| cat512, спасибо протестирую Ваш вариант на стабильность. У вас же все нормально работало? Может и правда дело в моей среде.... на двух компьютерах стоит XP с одного диска. |
| Автор: cat512 18.2.2011, 16:38 |
| Да, у меня wmi работал стабильно |
| Автор: Coder 22.2.2011, 15:16 |
| cat512, Погонял программу с вашим кодом.... и я понял в чем проблема - периодически программа не может достучатся до некоторых классов WMI через WQL запрос. Возможно дело в флаге wbemFlagReturnImmediately, но как задать тайм аут на выполнение запроса не нашел. может система не успевает отвечать .... ? |
| Автор: cat512 22.2.2011, 16:08 | ||
Каким образом это проявляется? Вылетает AV? Нет ответа длятельное время от сервиса? Можешь попробовать wbemFlagReturnWhenComplete (синхронный режим), но тогда будешь ожидать окончания запроса. Либо асинхронный (надо создовать объекты события) http://msdn.microsoft.com/en-us/library/aa393980(v=vs.85).aspx |