我使用 Win32 API 编写了一个 C 程序 FindNextFile查找文件
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
int _tmain(int argc, TCHAR *argv[])
{
HANDLE hNextFile;
WIN32_FIND_DATA findFileData;
LPCTSTR fileName = argv[1]; //input argument "C:\test\file*.txt"
hNextFile = FindFirstFile(fileName, &findFileData);
while(hNextFile != INVALID_HANDLE_VALUE)
{
printf("long name: %s\t8dot3 name: %s\n", findFileData.cFileName, findFileData.cAlternateFileName);
hNextFile = FindNextFile(fileName, &findFileData); //Unhandled exception here!
}
printf("%s", GetLastError());
return 0;
}
第一次调用FindNextFile时,抛出异常。 异常信息:
Unhandled exception at 0x77178dc9 in findfile.exe: 0xC0000005: Access violation writing location 0x005c0080.
你能给我一些建议吗?
提前致谢。
<小时/>我已经这样修改了我的代码,它工作得很好。感谢皮埃尔的解释。
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
int _tmain(int argc, TCHAR *argv[])
{
HANDLE hNextFind;
WIN32_FIND_DATA findFileData;
LPCTSTR fileName = argv[1];
BOOL result = TRUE;
if((hNextFind = FindFirstFile(fileName, &findFileData)) == INVALID_HANDLE_VALUE)
return 1;
while(result)
{
_tprintf(TEXT("long name: %s\t8dot3 name: %s\n"), findFileData.cFileName, findFileData.cAlternateFileName);
result = FindNextFile(hNextFind, &findFileData);
}
FindClose(hNextFind);
return 0;
}
最佳答案
您的代码中有很多错误。
首先,你没有正确使用FindNextFile,原型(prototype):
BOOL WINAPI FindNextFile( _In_ HANDLE hFindFile, _Out_ LPWIN32_FIND_DATA lpFindFileData );
之后,您没有正确使用
GetLastError()
,从而引发异常。GetLastError
返回一个DWORD
,您可以将其打印为字符串。 (http://msdn.microsoft.com/en-us/library/ms679360(v=vs.85).aspx)
以下是您的代码应如下所示的示例:
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
int _tmain(int argc, TCHAR *argv[])
{
HANDLE hNextFile;
WIN32_FIND_DATA findFileData;
LPCTSTR fileName = argv[1]; //input argument "C:\test\file*.txt"
hNextFile = FindFirstFile(fileName, &findFileData);
BOOL res = TRUE;
//^^^^^^^^^^^^^^^^
while(hNextFile != INVALID_HANDLE_VALUE && res)
// ^^^^^^
{
printf("long name: %s\t8dot3 name: %s\n", findFileData.cFileName, findFileData.cAlternateFileName);
res = FindNextFile(hNextFile, &findFileData); //Unhandled exception here!
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
printf("%d", GetLastError());
// ^^ // You can also use FormatMessage as it is said in the documentation
return 0;
}
关于调用函数FindNextFile抛出访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17483301/