wnetutility.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "wnetutility.h"
  2. #include <memory>
  3. //#include <QDebug>
  4. #include "LHQLogAPI.h"
  5. #ifdef Q_OS_WIN
  6. #include <windows.h>
  7. #endif
  8. //------------------------------------------------------------------------
  9. //函 数:WNetTryConnect(const QString &strPath,const QString &strUser,const QString &strPwd)
  10. //
  11. //说 明:测试WNet连接,远程访问时用到
  12. //
  13. //参 数:
  14. //[传入]strPath 路径
  15. //[传入]strUser 用户名
  16. //[传入]strPwd 密码
  17. //
  18. //返 回 值:是否成功
  19. //------------------------------------------------------------------------
  20. bool WNetUtility::WNetTryConnect(const QString &strPath,const QString &strUser,const QString &strPwd)
  21. {
  22. bool bRet = false;
  23. #ifdef Q_OS_WIN
  24. QString remotePath(strPath);
  25. int index = remotePath.indexOf("\\\\");
  26. if (index >= 0) {
  27. index = remotePath.indexOf("\\", index + 2);
  28. if (index > 0) {
  29. remotePath = remotePath.left(index);
  30. }
  31. }
  32. NETRESOURCE nr;
  33. nr.dwScope = RESOURCE_GLOBALNET;
  34. nr.dwType = RESOURCETYPE_DISK;
  35. nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
  36. nr.dwUsage = RESOURCEUSAGE_CONTAINER;
  37. nr.lpLocalName = nullptr;
  38. size_t len = wcslen(remotePath.toStdWString().data()) + 1;
  39. std::unique_ptr<wchar_t[]> wcs(new wchar_t[len]{0});
  40. wcscpy_s(wcs.get(), len, remotePath.toStdWString().data());
  41. nr.lpRemoteName = wcs.get();
  42. nr.lpProvider = nullptr;
  43. size_t userLen = wcslen(strUser.toStdWString().data()) + 1;
  44. std::unique_ptr<wchar_t[]> lpszUser(new wchar_t[userLen]{0});
  45. wcscpy_s(lpszUser.get(), userLen, strUser.toStdWString().data());
  46. size_t pdLen = wcslen(strPwd.toStdWString().data()) + 1;
  47. std::unique_ptr<wchar_t[]> lpszPwd(new wchar_t[pdLen]{0});
  48. wcscpy_s(lpszPwd.get(), pdLen, strPwd.toStdWString().data());
  49. // 取消连接
  50. DWORD dwReturn1 = WNetCancelConnection2(wcs.get(),CONNECT_UPDATE_PROFILE, true);
  51. if (NO_ERROR != dwReturn1) {
  52. DoLog(QString("远程共享目录断开连接失败!错误码:%1").arg(dwReturn1));
  53. }
  54. DWORD dwReturn = WNetAddConnection2(&nr, lpszPwd.get(), lpszUser.get(), 0);
  55. DoLog(QString("远程共享目录连接结果:%1").arg(dwReturn));
  56. if (NO_ERROR == dwReturn ||
  57. ERROR_DEVICE_ALREADY_REMEMBERED == dwReturn ||
  58. (ERROR_SESSION_CREDENTIAL_CONFLICT == dwReturn && dwReturn1 != ERROR_NOT_CONNECTED)) {
  59. bRet = true;
  60. } else {
  61. qInfo() << QString("远程共享目录登陆失败!错误码:%1").arg(dwReturn);
  62. if (ERROR_LOGON_FAILURE == dwReturn) {
  63. //DoLog("连接失败!");
  64. }
  65. bRet = false;
  66. }
  67. #else
  68. // Linux挂载?
  69. #endif
  70. return bRet;
  71. }