2017-07-27 6 views
6

である私は私のローカルデバイスXに(のは、\サーバー\フォルダを言わせて)共有を接続しようとしている:でWNetAddConnection2は、エラー1200を返します - ローカル名が有効

[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; 
    } 

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

を呼び出すとき関数は単にfalseを返します - エラーは1200(BAD_DEVICE)と表示されます。 NETRESOURCEは次のようになります。私はすでにいくつかのスニペット(のPInvoke)で確認

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

は、私は何の違いを見ることはできません置きます。たぶん、あなたはこの謎を解くことができます...

EDIT1

Variables when trying to map the drive

+0

ローカル名を指定しないとマップドライブは機能しますか?つまり、 'localName'を空の文字列にします。これは他の問題があるかどうかの手がかりを与えるかもしれません。エラーコード1200は、あなたの "X:\"に正しくないものがあることを意味します。余分なスペースがあります(https://stackoverflow.com/questions/31137879/excel-to-sharepoint-mapnetworkdrive-errorを参照してください) – Subbu

+0

残念ながら、ローカルドライブが指定されていなくてもエラー1200が続く(空文字列)。さらなるNetResourceの詳細については、私のEdit1を参照してください。 (私は、サーバー名をクリアしなければならなかった、申し訳ありません。 – C4p741nZ

答えて

3
[StructLayout(LayoutKind.Sequential)] 

、属性がCharSetプロパティを指定していません。デフォルトはCharSet.Ansiです。これは、タイムマシンでの旅行を必要とする驚異的な選択で、1998年に戻っています。コードは8ビット文字に変換された構造体を関数に渡します。明示的に関数のUnicodeフレーバを使用します。必然的に、インプリメンテーションはゴミを認識します。

[MarshalAs]を使用して、個々の文字列メンバーのマーシャリングを強制することができます。しかし、文字の種類を一致させるのは単純で論理的です。修正:

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

それは、ありがとうございます! – C4p741nZ

1

私は最終的にそれをやりました。

私は私のNETRESOURCEクラス内のすべての文字列フィールドに

[MarshalAs(UnmanagedType.LPWStr)] 

属性を追加することで問題を解決しました。残念ながら、私はこれで問題が解決される理由がわからない...

問題はスタート地点である
関連する問題