尝试获取对cd-rom设备的低级访问权限时,CreateFile分配2(!!)句柄,并且CloseHandle仅关闭一个句柄。操作系统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);
是什么可能原因,或者仅仅是Microsoft错误?
更新。没有剪切和粘贴驱动器名称。右字符串为L“\\。\ E:”。错误仍然存在。
更新2。问题解决了!请参阅以下来自我的答案(欧米茄)。
最佳答案
您的示例代码中似乎存在一些错误。如果实际上是从您的程序中复制并粘贴的,那么就必须进行其他操作。
首先,您要使用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;
}
注释掉CloseHandle调用也会导致handleCount像预期的那样增加。