Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 为什么FindFirstFileW总是返回-1?_Winapi_Unicode_Syntax_Vb6 - Fatal编程技术网

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玩家的做法,即在我的回答中保持一致。