Страница: 1 |
Страница: 1 |
Вопрос: Помогите подключить функцию API?
Добавлено: 29.03.07 13:32
Автор вопроса: Alex | Web-сайт:
Нужно в программе следить за каталогом, поступили ли в него данные.Пробовал по книге двумя способами, но не получается.
До этого работал только с VBA. У меня VB 2005 Exprese Edition.
Вот такой код - это последний вариант
первый с использованием Imports System.Runtime.InteropServices
Option Explicit On
Public Class Form1
Public Declare Auto Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" ( _
ByVal lpPathName As String, _
ByVal bWatchSubtree As Boolean, ByVal dwNotifyFilter As Long) _
As Long
Public Declare Auto Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
Public Declare Auto Function FindCloseChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
Public Declare Auto Function WaitForSingleObject Lib "kernel32" ( _
ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long '
Public Const INVALID_HANDLE_VALUE = -1&
Public Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1
Public Const WAIT_OBJECT_0 = 0&
Public Const WAIT_TIMEOUT = &H102& ''
Public catalog As Long
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim retVal As Long
Dim lpPathName As String = "d:\COMMON"
Dim bWatchSubtree As Long = API_TRUE
Dim dwNotifyFilter As Long = FILE_NOTIFY_CHANGE_FILE_NAME
Dim dwMilliseconds As Integer = 10000
'Me.WindowState = FormWindowState.Minimized
catalog = FindFirstChangeNotification(lpPathName, bWatchSubtree, dwNotifyFilter)
'в это месте выдает такое сообщение.
'попробовал перевести, но не очень понял в чем дело.
'A call to PInvoke function
'"ControlFolder!WindowsApplication1.Module1::FindFirstChangeNotification"
'has unbalanced the stack. This is likely because the 'managed PInvoke signature does not match the unmanaged 'target signature. Check that the calling convention and 'parameters of the PInvoke signature match the target 'unmanaged signature.
If catalog = INVALID_HANDLE_VALUE Then
MsgBox("Не могу следить за каталогом")
Me.Close()
End
Else
While (retVal = WaitForSingleObject(catalog, dwMilliseconds)) <> WAIT_OBJECT_0
End While
MsgBox("С каталогом работают")
FindNextChangeNotification(catalog)
End If
End Sub
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 29.03.07 14:42
В .NET есть встроеные средства для мониторинга файловой системы.
System.IO.FileSystemWatcher
ByVal lpPathName As String, _
ByVal bWatchSubtree As Boolean, ByVal dwNotifyFilter As Long) _
As Long |
Начинаем думать головой - в VB .NET типа 32-х битное целое число - это Integer.
Номер ответа: 2
Автор ответа:
Visual Basic .NET 2005 Пиратская версия
Вопросов: 38
Ответов: 190
Web-сайт:
Профиль | | #2
Добавлено: 29.03.07 15:41
Плюй ты на АПИ-шки... Для этого апишки не нужны.
FileSystemWatcher в помощь.
Номер ответа: 3
Автор ответа:
Visual Basic .NET 2005 Пиратская версия
Вопросов: 38
Ответов: 190
Web-сайт:
Профиль | | #3
Добавлено: 29.03.07 16:01
погоди, погоди...
мабудь в вбнет экспресс нет FSW?
Номер ответа: 4
Автор ответа:
Visual Basic .NET 2005 Пиратская версия
Вопросов: 38
Ответов: 190
Web-сайт:
Профиль | | #4
Добавлено: 29.03.07 16:04
ваабще всем совет-- тем кто юзает справочники ВИНАПИ для ВБ6 под НЕТ читать МСДН-овскую статью Upgrading Code from VB6 to VB.NET
или хотябы знать что
VB6 VB.NET
Short-8bit Short-16bit
Int-16bit Int-32bit
Long-32bit Long-64bit
Номер ответа: 5
Автор ответа:
Visual Basic .NET 2005 Пиратская версия
Вопросов: 38
Ответов: 190
Web-сайт:
Профиль | | #5
Добавлено: 29.03.07 16:04
черт,все пробелы удалились
Номер ответа: 6
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #6
Добавлено: 29.03.07 16:58
мабудь в вбнет экспресс нет FSW?
Какую траву ты курил? Еще скажи что в VB .NET Express нет .NET Framework.
или хотябы знать что
VB6 VB.NET
Short-8bit Short-16bit
Int-16bit Int-32bit
Long-32bit Long-64bit
По-моему, тот кто хоть что-то понимал в типах VB6 и VB .NET после твоего объяснения окончательно запутался.
Тип VB6 VB .NET CLS
8 бит, беззнаковый Byte Byte Byte
16 бит, знаковый Integer Short Int16
32 бит, знаковый Long Integer Int32
64 бит, знаковый - Long Int64
8 бит, знаковый - SByte SByte
16 бит, беззнаковый - UShort UInt16
32 бит, беззнаковый - UInteger UInt32
64 бит, беззнаковый - ULong UInt64
В VB .NET можно использовать как VB .NEt-типы, так и CLS-типы, разницы нет, при компиляции все равно получатся CLS-типы.
Номер ответа: 7
Автор ответа:
Alex
ICQ: no
Вопросов: 3
Ответов: 13
Web-сайт:
Профиль | | #7
Добавлено: 29.03.07 18:09
Спасибо большое. Дело было действительно в типах.
Все получилось, только подредактировал строку
Public Declare Auto Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA"
сделал
Public Declare Auto Function FindFirstChangeNotification Lib "kernel32".
А System.IO.FileSystem.Watcher - разбираться надо там help на английском, я его плохо знаю, а API у меня есть на русском. Но с использованием System.IO.FileSystem.Watcher я тоже напишу позже, для тренировки.