我正在尝试使用WNetAddConnection2取消对CancelSynchronousIo的来电。
对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;
}
答案 0 :(得分:2)
根据Larry Osterman的说法(我希望他不介意我引用他):“评论中回答了这个问题:wnetaddconnection2不是一个简单的IOCTL调用。”所以答案(不幸的是)不是。
答案 1 :(得分:0)
首先,void Count_Words( )
{
int count=0;
for (i = 0; inserted_text[i] != '\0';i++)
{
if (inserted_text[i] == ' ')
count++;
}
cout << "Word Count: " << count + 1;
}
是系统级的,而不是每个进程的。这很重要,因为多次调用WNetAddConnection2
可能会破坏系统稳定性-尤其是对于资源管理器而言。
我先使用WNetAddConnection2
来检查连接是否已经存在,甚至在考虑调用它之前-我的进程以前可能已经运行,然后关闭。连接可能仍然存在。当我的Windows服务需要添加这样的连接时,我会使用一个讨厌的小技巧,以防止这些完全不可中断的API停止我自己的服务关闭。
诀窍是在一个单独的进程中运行这些调用:毕竟它们是系统范围的。通常,您可以像自己调用函数一样等待该过程完成,但是如果您需要中止以关闭程序,则可以终止该过程并放弃等待。
但是,令人遗憾的是,某些Windows资源(例如命名管道句柄和在远程计算机上打开的文件的句柄)可能在远程计算机故障或关闭后大约需要16秒才能关闭。 WNetGetResourceInformation
似乎对这些都没有帮助,但可能会增加额外的长时间延迟。