FindFirstFileA (ANSI)按其应有的方式工作,而FindFirstFileW (Unicode)不工作。宽版本总是返回-1 (INVALID_HANDLE_VALUE),但为什么?
'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 SubP.S.感谢凯里·格雷戈里,但我仍然需要一些帮助来翻译宽版本。在WCHAR中,什么是C/C++ VB6?
//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;发布于 2013-03-29 00:43:57
WIN32_FIND_DATA有两个版本,就像使用它们的函数一样: ANSI版本和Unicode版本。您需要定义WIN32_FIND_DATAA和WIN32_FIND_DATAW,并在“A”和“W”函数中适当地使用它们。
发布于 2013-03-29 04:16:15
嗯,在重读这篇文章之后我发现了我的错误。它不是关于单独的WIN32_FIND_DATAW类型,而是需要将FindFirstFileW参数声明为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))https://stackoverflow.com/questions/15694538
复制相似问题