我正在开发一个在Windows XP SP3上运行的MFC应用程序。其中一个要求是,当用户登录应用程序时,应用程序必须使用该用户的凭据挂载托管在Linux服务器上的多个SMB共享。
该程序具有“切换用户”功能,允许其他用户在不关闭应用程序的情况下登录,从而终止第一个用户的会话。发生这种情况时,必须卸载SMB共享,然后重新安装为新用户。
我们通过调用WNetCancelConnection2
然后立即WNetAddConnection2
来执行此操作。 WNetCancelConnection2
返回NO_ERROR
,表示成功。 但是,有时WNetAddConnection2
无法将驱动器重新安装为新用户。使用FormatMessage
从返回值中获取错误字符串会导致出现此错误消息,尽管事实如此WNetCancelConnection2
似乎成功了:
不允许同一用户使用多个用户名与服务器或共享资源建立多个连接。断开之前与服务器或共享资源的所有连接,然后重试。
从命令提示符运行net use
也不会显示与SMB共享的打开连接。
如果用户从不与已安装的驱动器进行交互,则不会发生此故障。只有当用户以某种方式访问了已安装的驱动器时才会出现这种情况,即用户在Windows资源管理器中打开已安装的驱动器。同样,如果您完全退出应用程序然后重新启动它并以另一个用户。
所有这些让我相信,在关闭网络资源的所有打开句柄之前,WNetCancelConnection2
会返回竞争条件。我的问题是我可以在调用WNetCancelConnection2
之后让我的程序阻塞或等待,直到所有这些句柄都关闭,保证WNetAddConnection2
不会以这种方式失败吗?要么阻止API或忙于等待连接完全关闭的方法是可以接受的。要么优于sleep()
,要么是最好的。 : - )