2

我正在开发在 Windows XP SP3 上运行的 MFC 应用程序。其中一项要求是,当用户登录应用程序时,应用程序必须使用该用户的凭据安装多个托管在嵌入式 Linux 服务器上的 SMB 共享。

该程序具有“切换用户”功能,允许不同的用户在不关闭应用程序的情况下登录,从而终止第一个用户的会话。发生这种情况时,必须卸载 SMB 共享,然后作为新用户重新安装。

我们通过调用来做到这一点,WNetCancelConnection2然后立即调用WNetAddConnection2WNetCancelConnection2返回NO_ERROR,表示成功。 但是,有时WNetAddConnection2会无法以新用户身份重新安装驱动器。FormatMessage尽管WNetCancelConnection2似乎成功了,但 使用从返回值中获取错误字符串会导致此错误消息:

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

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

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

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

4

0 回答 0