处理 WinAPI CreateFile 中的泄漏?

Sve*_*ana 2 c++ winapi cd-burning

CreateFile 分配 2(!!) 个句柄,CloseHandle 在尝试获得对 cd-rom 设备的低级别访问时仅关闭一个句柄。操作系统 Windows XP SP3,7 台经过测试的计算机中的 5 台工作原理相同。

当尝试访问硬盘驱动器号时,CreateFiles 工作正常并且只分配一个句柄。

这是示例代码:

HANDLE m_driveHandle = CreateFileW("\\\\.\\E", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CloseHandle(m_driveHandle);

可能的原因是什么,或者这只是微软的错误?

更新。驱动器名称未被剪切和粘贴。正确的字符串是 L"\\.\E:"。Bug 仍然存在。

更新2。问题解决了!请参阅下面的我(欧米茄)的答案。

Jas*_*wen 5

您的示例代码中似乎存在一些错误。如果它实际上是从您的程序中复制和粘贴的,那么肯定会有其他事情发生。

首先,您使用 MBCS 字符串调用 Unicode 函数:第一个参数应该L_T().

其次,也许更重要的"\\\\.\\E"是,它不是一个有效的名称。您缺少尾随冒号:要打开卷,它需要采用 形式\\.\X:,或者在您的情况下为"\\\\.\\E:"

在修复了这两个错误之后(第一个阻止编译,第二个需要得到除INVALID_HANDLE_VALUE返回之外的任何东西),一切似乎都按预期工作。我用GetProcessHandleCount统计了打开的句柄数,前后都是一样的:

HANDLE m_driveHandle = NULL;
HANDLE m_process = GetCurrentProcess();
DWORD handleCount;
GetProcessHandleCount(m_process, &handleCount);
cout << "Currently held handles: " << handleCount << endl;

for (int i = 0; i < 10; ++i)    {
    m_driveHandle = CreateFileW(L"\\\\.\\E:",
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );
    if (INVALID_HANDLE_VALUE == m_driveHandle)  {
        cout << "Invalid handle" << endl;
    }   else    {
        CloseHandle(m_driveHandle);
    }

    GetProcessHandleCount(m_process, &handleCount);
    cout << "Currently held handles: " << handleCount << endl;
}
Run Code Online (Sandbox Code Playgroud)

注释掉 CloseHandle 调用也会导致 handleCount 按预期递增。