2010-01-25 3 views
2

У меня странная проблема с кодом, который вызывает WNetGetUniversalName. Когда я вызываю функцию, я всегда получаю ошибку 67 (ERROR_BAD_NET_NAME). Но сетевое соединение действительно существует.
Так что с нуля. Я пишу расширение оболочки Windows, которое должно делать некоторые вещи с текстовыми файлами, которые расположены на указанном сетевом диске. Поэтому, когда вызывается метод IShellExtInit :: Initialize, я сохраняю перетаскиваемый файл и затем получаю имя соединения с помощью метода WNetGetUniversalName.
Так что я действительно могу быть уверен, что сетевой диск существует (как это исходит от метода DragQueryFile).
Вот код:Проблема с WNetGetUniversalName

char buffer[4096]; 
REMOTE_NAME_INFO *info = (REMOTE_NAME_INFO*)buffer; 
DWORD length = 4096; 
info->lpConnectionName = NULL; 
info->lpRemainingPath = NULL; 
info->lpUniversalName = NULL; 
DWORD error = WNetGetUniversalName(file, REMOTE_NAME_INFO_LEVEL, info, &length); 

файл является ATL :: CString, который исходит от метода DragQueryFile и ошибок всегда 67.
Странным является то, что она работает несколько дней назад, но не больше, и я не изменил ни один из этих кодов.

+0

Вы подтвердили, что содержимое 'file' - это то, что вы думаете? (Через отладки/Log?) – Ruddy

+0

Да, я также пробовал его жестко закодированным с помощью: DWORD dwError = WNetGetUniversalName (_T («Z: \\ test.txt»), REMOTE_NAME_INFO_LEVEL, info и dwLength); и DWORD dwError = WNetGetUniversalName (_T ("Z:"), REMOTE_NAME_INFO_LEVEL, info и dwLength); Все тот же результат. –

ответ

0

Немного трудно догадаться о проблеме. Одна из возможностей заключается в том, что file, который вы передаете как имя файла, не отформатирован совершенно правильно. Например, даже если файл находится в корневой общей папке, то что-то вроде z:test.txt не будет работать - для этого требуется: z:\\test.txt.

Обычный способ вызова WNetGetUniversalName включает в себя последовательность, как:

  1. вызова с маленьким буфером, чтобы получить требуемый размер
  2. выделить надлежащий размером буфер
  3. вызова снова с буфером надлежащего размера

В отличие от множества сетевых функций Windows, этот, по-видимому, проверяет, что вы сначала отправили указатель не-NULL с положительным размером, а затем проверили, достаточно ли буфер достаточно для того, что он хочет вернуться, поэтому последовательность выглядит примерно так:

REMOTE_NAME_INFO temp; 
REMOTE_NAME_INFO *info = &temp; 
DWORD size = sizeof(temp); 

// call with buffer that's valid but too small.  
WNetGetUniversalNameA("z:\\test.txt", REMOTE_NAME_INFO_LEVEL, info, &size); 

// allocate large enough buffer: 
info = static_cast<REMOTE_NAME_INFO *>(::operator new(size)); 

// call again with large enough buffer: 
WNetGetUniversalNameA("z:\\test.txt", REMOTE_NAME_INFO_LEVEL, info, &size); 

// Show result: 
std::cout << info->lpUniversalName; 
+0

Извините, что не помогло. Но это становится более странным. Я опробовал WNetGetConnection, и он действительно работал, но WNetGetUniversalName все еще не работает. Тем не менее, я хотел бы знать, почему WNetGetUniversalName больше не работает, потому что я бы предпочел использовать этот метод. –