卸载然后立即重新安装SMB共享作为不同的用户失败

我正在使用Windows XP SP3上运行的MFC应用程序。 其中一个要求是,当用户login到应用程序时,应用程序必须使用该用户的凭证装载在embedded式Linux服务器上托pipe的多个SMB共享。

该程序具有“切换用户”function,允许不同的用户login而不closures应用程序,终止第一个用户的会话。 发生这种情况时,必须先卸载SMB共享,​​然后重新安装为新用户。

我们通过调用WNetCancelConnection2然后立即通过WNetAddConnection2做到这WNetAddConnection2WNetCancelConnection2返回NO_ERROR ,表示成功。 但是,有时WNetAddConnection2将无法重新安装驱动器作为新用户。 使用FormatMessage从返回值中获取错误string会导致此错误消息,尽pipeWNetCancelConnection2似乎成功:

不允许同一用户使用多个用户名连接到服务器或共享资源。 断开与服务器或共享资源的所有连接,然后重试。

从命令提示符下运行net use不显示到SMB共享的打开连接。

如果用户从不与安装的驱动器交互,则不会发生此故障。 只有当用户以某种方式访问​​安装的驱动器时才会发生这种情况,即用户在Windows资源pipe理器中打开了安装的驱动器。 同样,如果您完全退出应用程序,然后重新启动并以其他用户身份login,则不会发生这种情况。

所有这些都让我相信,在networking资源的所有打开句柄都closures之前, WNetCancelConnection2返回的竞争条件。 我的问题是我可以让我的程序块或调用WNetCancelConnection2后等待,直到所有这些句柄closures,保证WNetAddConnection2不会以这种方式失败? 阻塞API或忙于等待连接完全closures的方法是可以接受的。 要么最好sleep() ,希望最好。 🙂