2017-07-27 5 views
6

Je suis en train de connecter une part (disons \ server dossier \) à mon appareil local X:WNetAddConnection2 retourne Erreur 1200 - Nom local est valide

[DllImport("Mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
     private static extern int WNetAddConnection2(
      [In] NetResource lpNetResource, 
      string lpPassword, 
      string lpUsername, 
      int flags 
     ); 

public static bool Connect(string remoteName, string localName, bool persistent) { 
      if (!IsLocalPathValid(localName)) return false; 
      var r = new NetResource 
      { 
       dwScope = ResourceScope.RESOURCE_GLOBALNET, 
       dwType = ResourceType.RESOURCETYPE_ANY, 
       dwDisplayType = ResourceDisplayType.RESOURCEDISPLAYTYPE_SHARE, 
       dwUsage = ResourceUsage.RESOURCEUSAGE_CONNECTABLE, 
       lpRemoteName = remoteName, 
       lpLocalName = localName 
      }; 
      return WNetAddConnection2(r, null, null, persistent ? 1 : 0) == 0; 
     } 

[StructLayout(LayoutKind.Sequential)] 
    public class NetResource { 
     public ResourceScope dwScope; 
     public ResourceType dwType; 
     public ResourceDisplayType dwDisplayType; 
     public ResourceUsage dwUsage; 
     public string lpLocalName; 
     public string lpRemoteName; 
     public string lpComment; 
     public string lpProvider; 
    } 

Lorsque vous appelez

Connect(@"\\server\folder", "X:", true); 

la fonction retourne juste false - l'erreur dit 1200 (BAD_DEVICE). Le NETRESOURCE ressemble à ceci:

lpRemoteName = "\\\\server\\folder"; 
lpProvider = null; 
lpLocalName = "X:"; 
lpComment = null; 
dwUsage = Connectable; 
dwType = Any; 
dwScope = GlobalNet; 
dwDisplayType = Share; 

je l'ai déjà vérifié avec plusieurs extraits (PInvoke) mis je ne vois aucune différence. Peut-être que vous pouvez résoudre ce mystère ...

EDIT1

Variables when trying to map the drive

+0

Le lecteur de carte fonctionne-t-il si vous ne donnez pas de nom local? c'est-à-dire, rendre 'localName' une chaîne vide. Cela peut donner une idée de l'existence d'un autre problème. Le code d'erreur 1200 signifie qu'il y a quelque chose qui ne va pas avec votre "X: \" - y a-t-il de l'espace supplémentaire? (Voir https://stackoverflow.com/questions/31137879/excel-to-sharepoint-mapnetworkdrive-error) – Subbu

+0

Malheureusement non - l'erreur 1200 persiste, même sans lecteur local spécifié (chaîne vide). Voir mon Edit1 pour plus de détails NetResource. (J'ai dû effacer le nom du serveur, désolé.) – C4p741nZ

Répondre

3
[StructLayout(LayoutKind.Sequential)] 

C'est là que le problème a commencé, l'attribut ne spécifie pas la propriété CharSet. La valeur par défaut est CharSet.Ansi, un choix déroutant qui nécessite un voyage dans une machine à remonter le temps pour vous ramener à 1998. Ainsi, le code passe une structure avec des chaînes qui sont traduites en caractères 8 bits vers une fonction qui est utilise explicitement la saveur Unicode de la fonction. Inévitablement, la mise en œuvre voit des déchets.

Vous pouvez forcer le marshaling de chaque membre de chaîne avec [MarshalAs]. Mais il est simplement plus simple et logique de faire correspondre les types de caractères. Correction:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] 
+0

C'est tout, merci! – C4p741nZ

1

je finalement fait.

J'ai résolu le problème en ajoutant

[MarshalAs(UnmanagedType.LPWStr)] 

Attribut à chaque champ de chaîne dans ma classe NETRESOURCE. Malheureusement, je ne sais pas pourquoi cela résout le problème ...