Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Boolean
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileW" (lpFileName As Any, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileW" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Boolean
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Public Type WIN32_FIND_DATA
Atrybuty As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
nazwa(260) As Byte
End Type
Private WFD As WIN32_FIND_DATA
Sub Main()
Dim uchwyt As Long
Dim nazwa As String
Katalog = "g:\JpgNiesprawdzone\"
uchwyt = FindFirstFile(ByVal StrPtr(Katalog & "*.jpg"), WFD)
Do: nazwa = Left(WFD.nazwa, InStr(WFD.nazwa, Chr(0)) - 1)
NR = NR + 1
Loop While FindNextFile(uchwyt, WFD)
End Sub
to samo po małej przeróbce na Visual Studio 2012 Express '_________________________________________________________________________
Module mainModule
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Boolean
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileW" (lpFileName As Any, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileW" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Boolean
Public Structure FILETIME
Dim dwLowDateTime As Long
Dim dwHighDateTime As Long
End Structure
Public Structure WIN32_FIND_DATA
Dim Atrybuty As Long
Dim ftCreationTime As FILETIME
Dim ftLastAccessTime As FILETIME
Dim ftLastWriteTime As FILETIME
Dim nFileSizeHigh As Long
Dim nFileSizeLow As Long
Dim dwReserved0 As Long
Dim dwReserved1 As Long
Dim nazwa As String
End Structure
Private WFD As WIN32_FIND_DATA
Sub Main()
Dim uchwyt As Long
Dim Katalog, NR
Dim nazwaPliku
Katalog = "g:\JpgNiesprawdzone\"
uchwyt = FindFirstFile(ByVal StrPtr(Katalog & "*.jpg"), WFD)'<- "ByVal" Oczekiwano wyrażenia.
Do : nazwaPliku = Left(WFD.nazwa, InStr(WFD.nazwa, Chr(0)) - 1)
NR = NR + 1
Loop While FindNextFile(uchwyt, WFD)
End Sub
End Module
'-------------
2 Błędy
Element „As Any" nie jest obsługiwany w instrukcjach „Declare".
Błąd pierwszy - nie ma (chyba) typu Any (jest Variant), ale tam trzeba użyć typu String - mowa o deklaracji 2 funkcji.
Błąd drugi - chyba fałszywy alarm wynikający z poprzedniego błędu, ale tak czy inaczej brakuje ByVal w deklaracji 2 funkcji, która powinna wyglądać tak:
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileW" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Co do problemów na początku (teraz miałem czas i przejrzałem dokładniej podany kod), to drugi błąd (ten od ByVal) jest dlatego, że typy parametrów (ByVal, ByRef) podaje się tylko w deklaracji funkcji, a nie przy jej wywołaniu. Usuń wiec zbędny ByVal z kodu:
uchwyt = FindFirstFile(StrPtr(Katalog & "*.jpg"), WFD) '<-i będzie dobrze.
Module mainModule
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Boolean
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileW" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
'Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileW" (lpFileName As Any, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileW" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Boolean
Public Structure FILETIME
Dim dwLowDateTime As Long
Dim dwHighDateTime As Long
End Structure
Public Structure WIN32_FIND_DATA
Dim Atrybuty As Long
Dim ftCreationTime As FILETIME
Dim ftLastAccessTime As FILETIME
Dim ftLastWriteTime As FILETIME
Dim nFileSizeHigh As Long
Dim nFileSizeLow As Long
Dim dwReserved0 As Long
Dim dwReserved1 As Long
Dim nazwa As String
End Structure
Private WFD As WIN32_FIND_DATA
Sub Main()
Dim uchwyt As Long
Dim Katalog, NR&
Dim nazwaPliku
Katalog = "g:\JpgNiesprawdzone\"
'uchwyt = FindFirstFile(ByVal StrPtr(Katalog & "*.jpg"), WFD)
uchwyt = FindFirstFile(Katalog & "*.jpg", WFD)
Do : nazwaPliku = Left(WFD.nazwa, InStr(WFD.nazwa, vbNullChar) - 1)
NR = NR + 1
Loop While FindNextFile(uchwyt, WFD)
End Sub
End Module
Przy wierszu 32: uchwyt = FindFirstFile(Katalog & “*.jpg”, WFD)
pojawia się teraz informacja:
Additional Information: Wywołanie funkcji PInvoke Projectl!
Czy nie jest tak, że przy podawaniu ścieżek (katalogów) należy znak “” podwajać: “\” bo jeden to prefiks znaku specjalnego (np. “\n” to nowy wiersz). CHYBA, bo ja nie programuję w VB i nie mam go by to sprawdzać. Może w Basicu nie trzeba…
Już wiem, gdzie masz błąd - przejrzałem dokumentację i sprawdziłem u siebie w Excelu (VBA) na Windows XP:
Błąd polega na braku pola dla skróconej nazwy pliku w WIN32_FIND_DATA - musisz na końcu ją zadeklarować (ja nazwałem to pole short):
Public Type WIN32_FIND_DATA
Atrybuty As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
nazwa(260) As Byte
short(14) As Byte
End Type
Dodatkowo ja musiałem zmienić nazwę “FindFirstFileW” na “FindFirstFileA” w 2 miejscach na początku - i zadziałało (być może w Windows Vista/7 nie trzeba tego robić).
Module mainModule
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Boolean
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal FindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Public Structure FILETIME
Dim dwLowDateTime As Long
Dim dwHighDateTime As Long
End Structure
Public Structure WIN32_FIND_DATA
Dim Atrybuty As Long
Dim ftCreationTime As FILETIME
Dim ftLastAccessTime As FILETIME
Dim ftLastWriteTime As FILETIME
Dim nFileSizeHigh As Long
Dim nFileSizeLow As Long
Dim dwReserved0 As Long
Dim dwReserved1 As Long
Dim nazwa As String
Dim cAlternate As String
End Structure
Private WFD As WIN32_FIND_DATA
Sub Main()
Dim uchwyt As Long
Dim NR& ', Katalog
Dim nazwaPliku
'Katalog = "g:\JpgNiesprawdzone\"
'uchwyt = FindFirstFile(ByVal StrPtr(Katalog & "*.jpg"), WFD)
'uchwyt = FindFirstFile(Katalog & "*.jpg", WFD)
uchwyt = FindFirstFile("g:\JpgNiesprawdzone\*.jpg", WFD)
Do : nazwaPliku = Left(WFD.nazwa, InStr(WFD.nazwa, vbNullChar) - 1)
NR = NR + 1
Loop While FindNextFile(uchwyt, WFD)
End Sub
End Module
Po zmianie 2x FindFirstFileW na FindFirstFileA teraz w polu