调用函数FindNextFile抛出访问冲突异常

标签 c winapi access-violation unhandled-exception

我使用 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/

相关文章:

c - 通过 mex 传回数组

c - 我如何计算这个函数的时间复杂度?

c - 文本文件每一行上特定符号的出现频率

c - 标准输入上的 ReadFile 在 Windows 7 上崩溃

c - 我的 C 语法的左递归错误

c - 另一个令人头疼的winapi文件权限C。为什么我的方法不起作用?

windows - 使用 Windows 8 SDK 为 Windows 7 编译

c++ - b2BlockAllocator.cpp 中的 Box2D 崩溃

c - 删除链表中具有特定值的所有节点

执行指针时出现 C++ 访问冲突