Windows文件API CloseHandle函数抛出异常:"指定了无效句柄"

时间:2014-12-19 13:01:41

标签: winapi exception visual-c++

我编写的函数(在MS VS 2013中的Visual C ++中)与

上的函数不同

Recursively searching for files in the computer

以下是我的函数的源代码:

wstring FolderPathValidator::FindRequiredFolder(const wstring& p_InitialPath, wstring p_RequiredFolderName)
{
    wstring foundFolder = L"";
    wstring folderPath = p_InitialPath + L"\\*";
    WIN32_FIND_DATAW folderInfo;
    HANDLE search_handle = FindFirstFileW(folderPath.c_str(), &folderInfo);
    if (search_handle != INVALID_HANDLE_VALUE)
    {
        vector<wstring> folders;

        do
        {
            if (folderInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if ((!lstrcmpW(folderInfo.cFileName, L".")) || (!lstrcmpW(folderInfo.cFileName, L"..")))
                    continue;
            }

            folderPath = p_InitialPath + L"\\" + wstring(folderInfo.cFileName);

            if (folderInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if (folderInfo.cFileName == p_RequiredFolderName)
                {
                    foundFolder = folderInfo.cFileName;
                    return foundFolder;
                }
                folders.push_back(folderPath);
            }
        } while (FindNextFileW(search_handle, &folderInfo));

        CloseHandle(search_handle);

        for (vector<wstring>::iterator iter = folders.begin(), end = folders.end(); iter != end; ++iter)
            FindRequiredFolder(*iter, p_RequiredFolderName);
    }

    return foundFolder;
}

功能开始没有问题。但是当它试图执行该行

CloseHandle(search_handle);

然后出现以下异常:

First step of exception handling on address 0x76D712C7 в WordsCounter.exe: 0xC0000008: An invalid handle was specified.

其中'WordsCounter'是应用程序可执行文件的名称。 FindRequiredFolder函数是FolderPathValidator类的成员。 FolderPathValidator类位于静态类库项目中。这两个项目:使用库的类库和C ++控制台应用程序都在同一个解决方案中。在文件和文件夹名称中,有时会出现西里尔字母的俄文名称。但我不认为西里尔文件夹或文件名是这个错误的原因。这个错误的原因是什么?我该如何纠正?请帮忙。

1 个答案:

答案 0 :(得分:1)

  1. 使用FindClose代替CloseHandle。你在哪里读到必须使用CloseHandle?

  2. 使用T()或TEXT()宏,l&#34; unicode字符串的前缀(TEXT( "" ))。

  3. 使用不lstrcmp的{​​{1}}。它是宏,如果您的项目是Unicode,则调用lstrcmpW。