доступ к диску UNC / удаленному сетевому диску в c ++ - PullRequest
2 голосов
/ 20 января 2011

Я пытаюсь получить доступ к сетевому диску (\ имя_сервера или \ ipadress).Идея состоит в том, что доступ к диску возможен только через приложение, а логин на сетевом диске должен использоваться только приложением.Пока что я нашел только функцию WNetUseConnection (http://msdn.microsoft.com/en-us/library/aa385482%28VS.85%29.aspx), которая выглядит как то, что я хочу. К сожалению, я не могу заставить ее работать. Код выглядит так:

   NETRESOURCE nr;;
   nr.dwType = RESOURCETYPE_DISK;
   wchar_t remoteName[] = L"\\\\myremotenetworkdrive";
   nr.lpRemoteName = remoteName;
   wchar_t pswd[] = L"mypswd";
   wchar_t usrnm[] = L"usrname";

   int ret = WNetUseConnection(NULL,  &nr, pswd, usrnm, 0, NULL, NULL, NULL);
   std::cerr << "return code: " << ret << std::endl;

Код возврата:вначале 1200 (ERROR_BAD_DEVICE), а после другого вызова функции изменяется на 487. (ERROR_INVALID_ADDRESS). Адрес (если я могу поместить туда 4 обратной косой черты, но также пробовал его с двумя или вообще без них), имя пользователя и pswd верны.*

Итак, в основном мой вопрос: как мне заставить работать вышеобозначенный код? Учитывая мою задачу, это правильный подход (если нет, то как бы вы это сделали)?

1 Ответ

2 голосов
/ 20 января 2011

Я считаю, что вам нужно очистить структуру NETRESOURCE (или напрямую инициализировать всех участников). Memset до установки других значений может помочь:

memset( &nr, 0, sizeof( nr ));

Кроме того, вам необходимо указать имя ресурса, как указано в комментариях:

wchar_t remoteName[] = L"\\\\server\\share";

Кроме того, если вы хотите связать его с определенной буквой диска, вы можете установить этот элемент:

nr.lpLocalName = L"z:";

Без очистки структуры или какой-либо ее инициализации, такие элементы, как lpLocalName, будут содержать «случайные» данные стека и приводить к неопределенному поведению.

...