Winapi 为什么FindFirstFileW总是返回-1?
Winapi 为什么FindFirstFileW总是返回-1?,winapi,unicode,syntax,vb6,Winapi,Unicode,Syntax,Vb6,FindFirstFileA(ANSI)可以正常工作,而FindFirstFileW(Unicode)不能正常工作。 宽版本总是返回-1(无效的句柄值),但是为什么呢 'Declarations: Option Explicit Private Const MAX_PATH As Long = 260 Private Const ALTERNATE As Long = 14 Private Const INVALID_HANDLE_VALUE As Long = -1 Private Ty
FindFirstFileA
(ANSI)可以正常工作,而FindFirstFileW
(Unicode)不能正常工作。
宽版本总是返回-1(无效的句柄值),但是为什么呢
'Declarations:
Option Explicit
Private Const MAX_PATH As Long = 260
Private Const ALTERNATE As Long = 14
Private Const INVALID_HANDLE_VALUE As Long = -1
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * ALTERNATE
End Type
Private Declare Function FindFirstFileW Lib "kernel32" _
(ByVal lpFileName As String, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindFirstFileA Lib "kernel32" _
(ByVal lpFileName As String, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" _
(ByVal hFindFile As Long) As Long
Public Declare Function GetLastError Lib "kernel32" () As Integer
'Test Functions:
Public Function TestA(ByVal sf As String) As Long
If Len(sf) < 3 Then Exit Function
Dim wfd As WIN32_FIND_DATA
TestA = FindFirstFileA(sf, wfd)
'Debug.Print "AE:" & GetLastError()
If TestA <> INVALID_HANDLE_VALUE Then FindClose TestA
End Function
Public Function TestW(ByVal sf As String) As Long
If Len(sf) < 3 Then Exit Function
Dim wfd As WIN32_FIND_DATA
TestW = FindFirstFileW(sf, wfd)
'Debug.Print "WE:" & GetLastError()
If TestW <> INVALID_HANDLE_VALUE Then FindClose TestW
End Function
'Example test
Private Sub Command1_Click()
Dim sDir As String
sDir = "C:\new"
MsgBox "A: " & TestA(sDir) & vbCrLf _
& "W: " & TestW(sDir)
End Sub
WIN32_FIND_数据有两个版本,就像使用它们的函数一样:ANSI版本和Unicode版本。您需要定义WIN32_FIND_DATAA和WIN32_FIND_DATAW,并将它们与“A”和“W”函数一起使用。WIN32_FIND_DATA有两个版本,与使用它们的函数一样:ANSI版本和Unicode版本。您需要定义WIN32_FIND_DATAA和WIN32_FIND_DATAW,并将它们与“A”和“W”函数一起正确使用。好吧,在重新阅读之后,我发现了我的错误。它不是关于单独的WIN32_FIND_DATAW类型,而是需要将
findfirstfile
参数声明为Long
和ByVal
Private Declare Function FindFirstFileW Lib "kernel32" _
(ByVal lpFileName As Long, _
ByVal lpFindFileData As Long) As Long
还需要使用StrPtr
和VarPtr
调用它们
TestW = FindFirstFileW(StrPtr(sf), VarPtr(wfd))
嗯,重读之后我发现了我的错误。它不是关于单独的WIN32_FIND_DATAW类型,而是需要将findfirstfile
参数声明为Long
和ByVal
Private Declare Function FindFirstFileW Lib "kernel32" _
(ByVal lpFileName As Long, _
ByVal lpFindFileData As Long) As Long
还需要使用StrPtr
和VarPtr
调用它们
TestW = FindFirstFileW(StrPtr(sf), VarPtr(wfd))
您能详细说明一下W版本的要求吗?正如您显然理解的,由于您的
TestA
和TestW
函数,ANSI和Unicode文本有单独的Win32 API函数。这些函数还需要单独的WIN32_FIND_数据结构,因为该结构包含文本数据。看看winbase.h中的WIN32_FIND_数据定义,您需要做的事情应该是显而易见的。谢谢您的回答!我仍然需要一些帮助。请看我更新的问题。您能详细说明一下W版本的要求吗?因为您的TestA
和TestW
函数,您显然明白,ANSI和Unicode文本有单独的Win32 API函数。这些函数还需要单独的WIN32_FIND_数据结构,因为该结构包含文本数据。看看winbase.h中的WIN32_FIND_数据定义,您需要做的事情应该是显而易见的。谢谢您的回答!我仍然需要一些帮助。请参阅我更新的问题。您仍然需要定义两个单独的WIN32_FIND_数据结构,因为Unicode版本的FindFirstFile将返回WIN32_FIND_DATAW结构。我不是VB专家,但我的理解是,你可以使用ChrW在VB中定义WCHAR。@CareyGregory-我认为WIN32_FIND_DATAW的VB版本是不可能的,当然,如果有人知道怎么做,我会感谢你的更正。这一点也不可能。只需将cFileName和cAlternateFileName声明为长度分别为MAX_PATH*2和14*2的字节。在VB6中使用WCHAR类型的示例遍布web。例如,我很感激你的帮助,我觉得你的建议很有道理,看起来很管用。但是我发现字节数组有不同的值,比如ex.cFileName(1到(260+16)*2)
和cAlternate((14*2)-1)
,我无法确定哪个是正确的。在说明两种方法的具体优点/缺点之前,可能还需要更高级的测试。目前,我认为要坚持大多数vb的做法,也就是像我的回答一样。您仍然需要定义两个单独的WIN32_FIND_数据结构,因为Unicode版本的FindFirstFile将返回WIN32_FIND_DATAW结构。我不是VB专家,但我的理解是,你可以使用ChrW在VB中定义WCHAR。@CareyGregory-我认为WIN32_FIND_DATAW的VB版本是不可能的,当然,如果有人知道怎么做,我会感谢你的更正。这一点也不可能。只需将cFileName和cAlternateFileName声明为长度分别为MAX_PATH*2和14*2的字节。在VB6中使用WCHAR类型的示例遍布web。例如,我很感激你的帮助,我觉得你的建议很有道理,看起来很管用。但是我发现字节数组有不同的值,比如ex.cFileName(1到(260+16)*2)
和cAlternate((14*2)-1)
,我无法确定哪个是正确的。在说明两种方法的具体优点/缺点之前,可能还需要更高级的测试。目前,我认为要坚持大多数vb玩家的做法,即在我的回答中保持一致。