CancelSynchronousIoでWNetAddConnection2への呼び出しをキャンセルしようとしていますが、失敗しています。キャンセル同期はWNetAddConnection2と連携しますか?
CancelSynchronousIoの呼び出しは成功しますが、実際には何もキャンセルされません。
Windows 7 x64で動作する32ビットコンソールアプリケーションを使用しています。
これは誰でも成功しましたか?私は何かばかげたことをしていますか?ここで(mpr.libとリンクする必要があります)サンプルコンソールアプリケーションです:
DWORD WINAPI ConnectThread(LPVOID param)
{
NETRESOURCE nr;
memset(&nr, 0, sizeof(nr));
nr.dwType = RESOURCETYPE_ANY;
nr.lpRemoteName = L"\\\\8.8.8.8\\bog";
// result is ERROR_BAD_NETPATH (i.e. the call isn't cancelled)
DWORD result = WNetAddConnection2(&nr, L"pass", L"user", CONNECT_TEMPORARY);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
// Create a new thread to run WNetAddConnection2
HANDLE hThread = CreateThread(0, 0, ConnectThread, 0, 0, 0);
if (!hThread)
return 1;
// Retry the cancel until it fails; keep track of how often
int count = 0;
BOOL ok;
do
{
// Sleep to give the thread a chance to start
Sleep(1000);
ok = CancelSynchronousIo(hThread);
++count;
}
while (ok);
// count will equal two here (i.e. one successful cancellation and
// one failed cancellation)
// err is ERROR_NOT_FOUND (i.e. nothing to cancel) which makes
// sense for the second call
DWORD err = GetLastError();
// Wait for the thread to finish; this takes ages (i.e. the
// WNetAddConnection2 call is not cancelled)
WaitForSingleObject(hThread, INFINITE);
return 0;
}
I/O操作、ドライバIRPをキャンセルします。 WNetAddConnection2は非常に異なる動物です。 –
リモートサーバーでFindFirstFileを実行すると、最初に接続を開始しようとするのがブロックされ、おそらくWNetAddConnection2と同じ内部コードとIRPが使用されます。基本的な違いはないようですが、前者は取り消し可能であり、後者は明らかにそうではありません。何か不足していますか? – arx
(あなたは@Hansと言うことを忘れてしまいました)私は、FindFirstFileがUNCパスの場合、FindFirstFile操作自体がキャンセルされているだけで、ネットワーク接続の試行自体が完了している(タイムアウトしている)可能性があります。その後廃棄される。 –