File System Watcher на VB6

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

File System Watcher на VB6

Сообщение BION » 21.08.2007 (Вт) 12:41

Всем привет.
У меня возникла необходимость написать File System Watcher на VB6(не .NET).

Накапал вот это:
Код: Выделить всё


Private strDir
Private strComputer
Private Body

Private objWMIService
Private objEvents
Private objReceivedEvent

Private Sub cmdStartWatch_Click()
    strDir = "\\temp\\"
    strComputer = "CompName"
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMv2")
    Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'CIM_DataFile'" & _
    " AND TargetInstance.Drive = 'c:'" & _
    " AND TargetInstance.Path ='" & strDir & "'")
   
    tmr.Enabled = True
   
End Sub

Private Sub Form_Load()
    tmr.Interval = 1000
End Sub

Private Sub tmr_Timer()
    Set objReceivedEvent = objEvents.NextEvent
    If Len(objReceivedEvent.TargetInstance.FileName) <> 0 Then
        Body = "File modifed: " & objReceivedEvent.TargetInstance.FileName & " " & objReceivedEvent.TargetInstance.Name
        MsgBox Body
    End If
End Sub


Работает, но вешает приложение при обращении к форме хоть и крутится таймер.
Однако должен заметить код предназначен для WScript, так что видимо для VB он не совсем применим.

Каково ваше мнение на этот счет?
Может быть кто встречал примеры с реализацией FSW на VB6 или на Python'e?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.08.2007 (Вт) 12:53

Опрашиваешь через WMI и удивляешься, что тормозит?
Используй API FindFirstChangeNotification.
Lasciate ogni speranza, voi ch'entrate.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 21.08.2007 (Вт) 13:04

Попробуй добавить DoEvents в tmr_Timer
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.08.2007 (Вт) 13:07

burik, ты понял смысл написанного тобой?
Lasciate ogni speranza, voi ch'entrate.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 21.08.2007 (Вт) 13:19

Для ВБ код применим. Вешает форму, так как используется синхронная подписка на события WMI. Асинхронная подписка так не вешает.
Salus populi suprema lex

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 21.08.2007 (Вт) 13:42

dr.MIG писал(а):Для ВБ код применим. Вешает форму, так как используется синхронная подписка на события WMI. Асинхронная подписка так не вешает.


А как подписаться асинхронно?

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 21.08.2007 (Вт) 15:46

alibek писал(а):burik, ты понял смысл написанного тобой?

А что там непонятного?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.08.2007 (Вт) 15:48

burik, каков сакральный смысл DoEvents в событии таймера?
Lasciate ogni speranza, voi ch'entrate.

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 21.08.2007 (Вт) 16:45

BION писал(а):
dr.MIG писал(а):Для ВБ код применим. Вешает форму, так как используется синхронная подписка на события WMI. Асинхронная подписка так не вешает.


А как подписаться асинхронно?


Я попробовал не так:
Код: Выделить всё

Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM ......

а так:
Код: Выделить всё

Set objEvents = objWMIService.ExecNotificationQueryAsync _
    ("SELECT * FROM ......

пишет "несовпадение типов" именно в этой строке

есть еще выриант:
Код: Выделить всё

Set objSink = CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.ExecQueryAsync objSink, "SELECT * FROM .......

но ругается, что-то типа удаленный комп не отвечает.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 21.08.2007 (Вт) 19:46

alibek писал(а):burik, каков сакральный смысл DoEvents в событии таймера?

Никакого.. А че нипонятного? :)
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.08.2007 (Вт) 20:18

Для чего тогда ты советуешь его туда вставить?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 21.08.2007 (Вт) 21:11

BION, у меня сейчас под рукой нет ни ВБ, ни WMICodeCreator'a - вернусь домой напишу, если не разберёшься. А вообще второй вариант, кажется, правильный - обрабатывай события объекта _SINK. А ошибка - её текст говорит о том, что в strComputer записано что-то не то - проверь ещё раз.
Salus populi suprema lex

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 22.08.2007 (Ср) 1:36

dr.MIG писал(а):BION, у меня сейчас под рукой нет ни ВБ, ни WMICodeCreator'a - вернусь домой напишу, если не разберёшься. А вообще второй вариант, кажется, правильный - обрабатывай события объекта _SINK. А ошибка - её текст говорит о том, что в strComputer записано что-то не то - проверь ещё раз.


Писал strComputer="." и strComputer="CompName"
всеравно "The remote server machine does not exist or is unavailable"

Скачал WMICodeCreator, он мне создал тот-же код.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 22.08.2007 (Ср) 6:39

alibek
Используй API FindFirstChangeNotification
Не совсем верно. При использовании этой функции не представляется возможным узнать, какие именно изменения произошли. Советую использовать GetDirectoryChangesW. Подобный вопрос я недавно поднимал на ВАСМе: http://wasm.ru/forum/viewtopic.php?id=21813
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.08.2007 (Ср) 7:39

Twister, да, твой вариант лучше.
Lasciate ogni speranza, voi ch'entrate.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 22.08.2007 (Ср) 10:35

Хакер писал(а):Для чего тогда ты советуешь его туда вставить?

Уже не советую. Забудь. Просто сначала это показалось разумным, а потом подумал и понял..
BION писал(а):Писал strComputer="." и strComputer="CompName"
всеравно "The remote server machine does not exist or is unavailable"

Скачал WMICodeCreator, он мне создал тот-же код.

BION, туда надо написать имя твоего компа (насколько я понял)
Код: Выделить всё

strComputer = Environ("ComputerName") ' или просто введи имя компа
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 22.08.2007 (Ср) 11:31

burik писал(а):
Хакер писал(а):Для чего тогда ты советуешь его туда вставить?

Уже не советую. Забудь. Просто сначала это показалось разумным, а потом подумал и понял..
BION писал(а):Писал strComputer="." и strComputer="CompName"
всеравно "The remote server machine does not exist or is unavailable"

Скачал WMICodeCreator, он мне создал тот-же код.

BION, туда надо написать имя твоего компа (насколько я понял)
Код: Выделить всё
strComputer = Environ("ComputerName") ' или просто введи имя компа


Вообще то под CompName я как раз и подразумевал имя своего компа :))
Что strComputer = ".", что strComputer = "Имя моего компьютера" - один хрен не работает.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.08.2007 (Ср) 11:47

Если не настроен доступ по DCOM (обычно он не настроен), то иначе, чем опустив второй параметр, вы объект не создадите.
Изображение

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 22.08.2007 (Ср) 11:55

Twister писал(а):alibek
Используй API FindFirstChangeNotification
Не совсем верно. При использовании этой функции не представляется возможным узнать, какие именно изменения произошли. Советую использовать GetDirectoryChangesW. Подобный вопрос я недавно поднимал на ВАСМе: http://wasm.ru/forum/viewtopic.php?id=21813


Я так понял ReadDirectoryChangesW?
Я нашел реализацию этой функции на PB.
Спасибо буду разбираться.

.

BION
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 259
Зарегистрирован: 24.01.2005 (Пн) 21:05

Сообщение BION » 22.08.2007 (Ср) 12:12

tyomitch писал(а):Если не настроен доступ по DCOM (обычно он не настроен), то иначе, чем опустив второй параметр, вы объект не создадите.


Нашел:
Microsoft WBEM Active Scripting Event Consumer Provider
Microsoft WBEM Unsecured Apartment
Microsoft WMI Provider Subsystem Host

разрешил им всё!
Убрал второй параметр - объект начал создаваться
но выдает несовпадение типов тут:
Код: Выделить всё

Set objEvents = objWMIService.ExecNotificationQueryAsync(MySink, _
    "SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE " & _
                    "TargetInstance ISA 'CIM_DataFile'" & _
                    " AND TargetInstance.Drive = 'c:'" & _
                    " AND TargetInstance.Path = '"&strDir&"'")


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 28

    TopList