将 parms 传递给 FindNextFileA 不起作用?

Passing parms to FindNextFileA doesn't work?

本文关键字:FindNextFileA 不起作用 parms      更新时间:2023-10-16

我以为我知道我在用这种技术做什么,但这次我一定在做一些不同的事情。

当我通过传递参数尝试查找下一个文件A时,我收到错误。

// "$FndDirEnt_Sbr_Mod.cpp"
#include <stdio.h>
typedef struct {
    char        SchPth[MAX_PATH];           //  Path of directory to search
    char        DirFilNamFnd[MAX_PATH];     //  Name of directory or file found
    bool        DirFndInd;                  //  Directory was found indicator
    bool        NrmBitInd;                  //  Normal bit on indicator
    bool        ArcBitInd;                  //  Archive bit on indicator
    bool        HidBitInd;                  //  Hidden bit on indicator
    bool        RdoBitInd;                  //  Read-only bit on indicator
    DWORD       LstErr;                     //  Error code if not found
}FndFilInfStc;
bool FndFstDirEnt(HANDLE * FndFilHnd, FndFilInfStc * FndFilInf)
;
bool FndNxtDirEnt(HANDLE FndFilHnd, FndFilInfStc * FndFilInf)
;
#include "$FndDirEnt_Sbr_Pub.h"
#define BitFnd(ChkBit, BitChkFor) ((ChkBit & BitChkFor) == BitChkFor)
void FndDirEnt()
{
    HANDLE          FndFilHnd;
    FndFilInfStc    FndFilInf;
    bool            FndDirErr;

    strncpy_s(FndFilInf.SchPth, sizeof(FndFilInf.SchPth), "C:\*.*", strlen("C:\*.*"));
    FndDirErr = FndFstDirEnt(&FndFilHnd, &FndFilInf);
    if (FndDirErr)
        FndDirErr = FndNxtDirEnt(&FndFilHnd, &FndFilInf);
}
bool FndFstDirEnt(HANDLE * FndFilHnd, FndFilInfStc * FndFilInf)
{
    LPCSTR              lpFileName;
    FINDEX_INFO_LEVELS  fInfoLevelId = FindExInfoBasic;
    LPVOID              lpFindFileData;
    FINDEX_SEARCH_OPS   fSearchOp = FindExSearchNameMatch;
    LPVOID              lpSearchFilter = NULL;
    DWORD               dwAdditionalFlags = FIND_FIRST_EX_LARGE_FETCH;
    size_t              NbrChrCvt = 0;
    _WIN32_FIND_DATAA   FndFilDta;
    *FndFilHnd = INVALID_HANDLE_VALUE;
    *FndFilHnd = FindFirstFileExA(FndFilInf->SchPth, fInfoLevelId, &FndFilDta, fSearchOp, lpSearchFilter, dwAdditionalFlags);
    if (*FndFilHnd == INVALID_HANDLE_VALUE) {
        FndFilInf->LstErr = GetLastError();
        printf("Invalid handle for %sn", FndFilInf->SchPth);
        return false;                   // **************** EARLY RETURN ****************
    }
    else {
        printf("%pn", FndFilHnd);
        return true;
    }
}

bool FndNxtDirEnt(HANDLE FndFilHnd, FndFilInfStc * FndFilInf)
{
    _WIN32_FIND_DATAA   FndFilDta;
    bool                FndDirErr;
    printf("%p   schpth=%sn", FndFilHnd, FndFilInf->SchPth);
    FndDirErr = FindNextFileA(FndFilHnd, &FndFilDta);           //  <-- error here
    return FndDirErr;
}

我收到以下错误:

Exception thrown at 0x00007FFB564D9C90 (ntdll.dll) 
in $FndDirEnt_Tst.exe: 0xC0000005: Access violation reading location
0xFFFFFFFFFFFFFFFF.

我得到的输出是:

00000033228FF078
00000033228FF078   schpth=C:*.*

我不知道我还能添加什么其他细节,但我在尝试提交问题时不断收到错误,说我的帖子主要是代码。蒂亚。

这里

FndDirErr = FndNxtDirEnt(&FndFilHnd, &FndFilInf);

您正在传递应传递句柄的句柄的地址。

句柄

的地址不是有效的句柄。

&FndFilHnd 中删除与号。