2010-01-25 7 views
2

J'ai un problème étrange avec du code qui appelle WNetGetUniversalName. Lorsque j'appelle la fonction, j'obtiens toujours l'erreur 67 (ERROR_BAD_NET_NAME). Mais la connexion réseau existe vraiment.
Donc, à partir de zéro. J'écris une extension de shell Windows qui doit faire des choses avec des fichiers texte qui sont situés sur un lecteur réseau spécifié. Ainsi, lorsque la méthode IShellExtInit :: Initialize est appelée, je stocke le fichier déplacé et obtient le nom de la connexion en utilisant la méthode WNetGetUniversalName.
Donc, je peux être vraiment sûr que le lecteur réseau existe (car il vient de la méthode DragQueryFile).
Voici quelques code:Problème avec 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); 
fichier

est un ATL :: CString qui vient de la méthode DragQueryFile et l'erreur est toujours 67.
chose étrange est que cela ne fonctionnait il y a quelques jours, mais pas plus, et je n'a pas changé aucun de ce code affiché.

+0

Avez-vous vérifié le contenu de 'file' est ce que vous pensez qu'il est? (Via le débogage/Log?) – Ruddy

+0

Oui, j'ai aussi essayé de le coder en dur avec: DWORD dwError = WNetGetUniversalName (_T ("Z: \\ test.txt"), REMOTE_NAME_INFO_LEVEL, info, & dwLength); et DWORD dwError = WNetGetUniversalName (_T ("Z:"), REMOTE_NAME_INFO_LEVEL, info, & dwLength); Toujours le même résultat. –

Répondre

0

Il est un peu difficile de deviner le problème. Une possibilité est que le file que vous passez car le nom de fichier n'est pas formaté correctement. Par exemple, même si le fichier est dans le répertoire racine partagé, quelque chose comme z:test.txt ne fonctionnerait pas - il faut: z:\\test.txt.

La façon habituelle d'appeler WNetGetUniversalName implique une séquence comme:

  1. Appel avec un petit tampon pour obtenir la taille requise
  2. allouer un tampon de taille convenable
  3. appel à nouveau avec un tampon de taille appropriée

Contrairement à quelques fonctions de réseau Windows, cependant, celui-ci vérifie apparemment que vous avez d'abord envoyé un pointeur non-NULL avec une taille positive, puis vérifie si le buffer est suffisamment grand pour il veut retourner, donc la séquence ressemble à ceci:

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

Désolé, cela n'a pas aidé. Mais ça devient plus étrange. J'ai essayé WNetGetConnection et cela a fonctionné, mais WNetGetUniversalName ne fonctionne toujours pas. Néanmoins, j'aimerais savoir pourquoi WNetGetUniversalName ne fonctionne plus parce que je préférerais utiliser cette méthode. –