IT笔记 · 2014年10月18日

WNetCancelConnection2 清理共享连接不干净的问题

  在windows上使用api WNetAddConnection2映射网络驱动器之后, 可用api WNetCancelConnection2来取消连接,手动在命令行使用net use [res|*] /del 也可以取消映射的连接

  但是这两种办法都有可能清理不干净, 导致下次使用WNetCancelConnection2的时候, 如果参数用的是另一个用户密码来加载共享文件夹, 就会返回1219的错误码.

  原因是还留存着之前连接打开过的File Handle, 使用Process Explorer可以Find到与连接地址相关的File Handle, 在Explorer.exe下.产生这种情况的方式, 目前已知有两种:
* 映射之后, 打开并浏览, 断网, 再调用WNetCancelConnection2, 有一定几率还残留Handle
* 直接文件夹窗输入共享文件夹地址, 弹出的登录窗输入用户密码后选择记住凭据, 打开后随便浏览, 然后再命令行使用net use \\ip\folder /del来取消连接, 有很大几率残留Handle

  这两种情况出现之后, 就会出现1219错误, 但net use确显示没有多余连接.这问题在XP与win7都能出现, 微软并没有给出官方解决办法, 或是我没找到, 只看到在官方有2014年8月的某位coder抱怨过这个问题并且也没有找到直接解决办法.
  其实问题的解决办法也比较简单, 由于这些Handle是残留在Explorer.exe进程里, 所以直接重启explorer.exe进程就OK了. 但是不知道重启explorer.exe对其它还有没有影响, 这个还需要观察一下.