首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么FindFirstFileW总是返回-1?

为什么FindFirstFileW总是返回-1?
EN

Stack Overflow用户
提问于 2013-03-29 00:32:39
回答 2查看 3K关注 0票数 0

FindFirstFileA (ANSI)按其应有的方式工作,而FindFirstFileW (Unicode)不工作。宽版本总是返回-1 (INVALID_HANDLE_VALUE),但为什么?

代码语言:javascript
复制
'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

P.S.感谢凯里·格雷戈里,但我仍然需要一些帮助来翻译宽版本。在WCHAR中,什么是C/C++ VB6?

代码语言:javascript
复制
//WinBase.h
typedef struct _WIN32_FIND_DATAA {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    CHAR   cFileName[ MAX_PATH ];
    CHAR   cAlternateFileName[ 14 ];
#ifdef _MAC
    DWORD dwFileType;
    DWORD dwCreatorType;
    WORD  wFinderFlags;
#endif
} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
typedef struct _WIN32_FIND_DATAW {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    WCHAR  cFileName[ MAX_PATH ];    //WCHAR in VB6?
    WCHAR  cAlternateFileName[ 14 ]; //WCHAR in VB6?
#ifdef _MAC
    DWORD dwFileType;
    DWORD dwCreatorType;
    WORD  wFinderFlags;
#endif
} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-29 00:43:57

WIN32_FIND_DATA有两个版本,就像使用它们的函数一样: ANSI版本和Unicode版本。您需要定义WIN32_FIND_DATAA和WIN32_FIND_DATAW,并在“A”和“W”函数中适当地使用它们。

票数 3
EN

Stack Overflow用户

发布于 2013-03-29 04:16:15

嗯,在重读这篇文章之后我发现了我的错误。它不是关于单独的WIN32_FIND_DATAW类型,而是需要将FindFirstFileW参数声明为LongByVal

代码语言:javascript
复制
Private Declare Function FindFirstFileW Lib "kernel32" _
    (ByVal lpFileName As Long, _
    ByVal lpFindFileData As Long) As Long

还需要使用StrPtrVarPtr来调用它们。

代码语言:javascript
复制
TestW = FindFirstFileW(StrPtr(sf), VarPtr(wfd))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15694538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档