サンプルコードにはいくつかのバグがあるようです。それが実際にあなたのプログラムからコピー&ペーストされた場合、何か他のことが起こっている必要があります。
まず、MBCS文字列を使用してUnicode関数を呼び出します。最初の引数は、先頭に。を付けるか、でL
囲む必要があり_T()
ます。
第二に、そしておそらくもっと重要なことに"\\\\.\\E"
、有効な名前ではありません。末尾のコロンがありません。ボリュームを開くには、の形式\\.\X:
である必要があります。あなたの場合は"\\\\.\\E:"
。
これらの2つのバグ(最初のバグはコンパイルを妨げ、2番目のバグは元に戻す以外のものを取得する必要があり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も期待どおりにインクリメントされます。