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