向FindNextFileA传递参数失败,出现访问违例错误求助
解决FindNextFileA调用时的访问违例错误
你遇到的0xC0000005访问违例,根源是传递给FindNextFileA的句柄值完全错误,我们来拆解问题并修复:
问题定位
从你的调用流程和程序输出就能明确问题所在:
- 在
FndDirEnt函数中,你定义了HANDLE FndFilHnd;,调用FndFstDirEnt(&FndFilHnd, &FndFilInf);是正确的——因为FndFstDirEnt需要HANDLE*类型参数来修改外部的句柄变量。 - 但接下来你调用
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); } }
额外优化建议
- 在
FndFstDirEnt里,你当前打印的是指针变量的地址,应该打印实际的句柄值,方便调试:
printf("实际句柄值: %p\n", *FndFilHnd);
- 每次调用
FindFirstFileExA成功后,必须在不再使用句柄时调用FindClose,防止系统资源泄漏。
关于0xFFFFFFFFFFFFFFFF的说明
当你传递完全无效的“句柄”(比如变量的内存地址)给FindNextFileA时,系统内部无法找到对应的文件搜索上下文,尝试访问无效内存区域就会触发访问违例,0xFFFFFFFFFFFFFFFF是系统对无效句柄进行错误处理后呈现的典型无效值。
内容的提问来源于stack exchange,提问作者J. Toran
相关产品推荐
相关产品推荐

