You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向FindNextFileA传递参数失败,出现访问违例错误求助

解决FindNextFileA调用时的访问违例错误

你遇到的0xC0000005访问违例,根源是传递给FindNextFileA的句柄值完全错误,我们来拆解问题并修复:

问题定位

从你的调用流程和程序输出就能明确问题所在:

  1. 在FndDirEnt函数中,你定义了HANDLE FndFilHnd;,调用FndFstDirEnt(&FndFilHnd, &FndFilInf);是正确的——因为FndFstDirEnt需要HANDLE*类型参数来修改外部的句柄变量。
  2. 但接下来你调用FndNxtDirEnt(&FndFilHnd, &FndFilInf);就犯了关键错误!FndNxtDirEnt的第一个参数是HANDLE(直接的句柄值),你却传了&FndFilHnd——也就是把FndFilHnd这个变量的内存地址当成了句柄值传进去了。

程序输出的两个00000033228FF078就是最好的佐证:第一个是FndFilHnd变量本身的地址(你在FndFstDirEnt里打印的是指针参数的地址),第二个是你传给FndNxtDirEnt的“伪句柄”值,用这个无效值调用FindNextFileA,系统必然会触发访问违例。

修复方案

只需要修正FndDirEnt里的调用,去掉&符号,直接传递句柄变量的值:

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); // 去掉&符号,传递实际句柄值
        // 记得用完句柄后关闭,避免资源泄漏
        FindClose(FndFilHnd);
    }
}

额外优化建议

  1. 在FndFstDirEnt里,你当前打印的是指针变量的地址,应该打印实际的句柄值,方便调试:
printf("实际句柄值: %p\n", *FndFilHnd);
  1. 每次调用FindFirstFileExA成功后,必须在不再使用句柄时调用FindClose,防止系统资源泄漏。

关于0xFFFFFFFFFFFFFFFF的说明

当你传递完全无效的“句柄”(比如变量的内存地址)给FindNextFileA时,系统内部无法找到对应的文件搜索上下文,尝试访问无效内存区域就会触发访问违例,0xFFFFFFFFFFFFFFFF是系统对无效句柄进行错误处理后呈现的典型无效值。

内容的提问来源于stack exchange,提问作者J. Toran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:54:18