WIN32_FIND_DATA问题 - cFileName

时间:2010-10-14 14:23:49

标签: c++ winapi

我的代码有问题;)

hFind = FindFirstFileEx( szPath, FindExInfoMaxInfoLevel, &FindData, FindExSearchNameMatch, NULL , 0);

strncpy_s( pszFileName, 280, FindData.cFileName, strlen(FindData.cFileName));

一切似乎都很好,但是当我将可执行文件复制到另一台计算机(Windows 2003)时,我得到了 但对于pszFileName,我得到了非常奇怪的输出

3 个答案:

答案 0 :(得分:2)

指定FindExInfoMaxInfoLevel不正确。 MSDN Library说:

  

FindExInfoMaxInfoLevel

     
    

此值用于验证。支持的值小于此值。

  

此外,从您使用FindFirstFileEx,我看不出为什么你不使用更简单的FindFirstFile function

答案 1 :(得分:1)

没有足够的代码来诊断问题,特别是没有任何错误检查的证据。但是,你发布的内容确实有些臭。您对strncpy_s()的调用表明pszFileName是一个指向包含280个元素的数组的指针。这个号码来自哪里?这只是猜测吗?在Windows上它永远不会超过260,为什么它更多?我怀疑当你把它变成真正的号码时,就像传递给你的函数的参数一样,而不是猜测你也会解决这个问题。

答案 2 :(得分:0)

如果没有先检查FindData是否有效,则不要使用hFind中的输出字段。来自MSDN docs

  

如果功能失败或失败   从中搜索字符串中的文件   lpFileName参数,返回   值为INVALID_HANDLE_VALUE和   lpFindFileData的内容是   不确定的。

因此,您应该(在解决此处答案中描述的API调用中的其他问题之后):

hFind = FindFirstFileEx( szPath, /* replace FindExInfoMaxInfoLevel here */, 
    &FindData, FindExSearchNameMatch, NULL , 0);
if (hFind != INVALID_HANDLE_VALUE)
{
  strncpy_s( pszFileName, 280, FindData.cFileName, strlen(FindData.cFileName));
}