2017-07-27 15 views
6

Tôi đang cố gắng để kết nối một phần (giả sử \ server \ thư mục) vào thiết bị X địa phương của tôi:WNetAddConnection2 trả Lỗi 1200 - tên địa phương là hợp lệ

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

Khi gọi

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

hàm chỉ trả về false - Error nói 1200 (BAD_DEVICE). Các NetResource trông như thế này:

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

Tôi đã kiểm tra với một số đoạn (PInvoke) đưa tôi không thể nhìn thấy bất kỳ sự khác biệt. Có lẽ bạn có thể giải quyết bí ẩn này ...

EDIT1

Variables when trying to map the drive

+0

Ổ đĩa bản đồ có hoạt động nếu bạn không đặt tên địa phương không? tức là, làm cho 'localName' thành một chuỗi rỗng. Điều này có thể cung cấp một số đầu mối cho dù có bất kỳ vấn đề khác. Mã lỗi 1200 có nghĩa là có điều gì đó không đúng với "X: \" của bạn - có thêm khoảng trống nào không (vui lòng xem - https://stackoverflow.com/questions/31137879/excel-to-sharepoint-mapnetworkdrive-error) – Subbu

+0

Thật không may là không - Lỗi 1200 vẫn tồn tại, ngay cả khi không có ổ đĩa cục bộ được chỉ định (chuỗi trống). Xem Edit1 của tôi để biết thêm chi tiết về NetResource. (Tôi phải xóa tên máy chủ, xin lỗi – C4p741nZ

Trả lời

3
[StructLayout(LayoutKind.Sequential)] 

Đó là nơi bắt đầu, thuộc tính không chỉ định thuộc tính CharSet. Mặc định là CharSet.Ansi, một sự lựa chọn kỳ quặc đòi hỏi một chuyến đi trong một cỗ máy thời gian có ý nghĩa, đưa bạn trở lại năm 1998. Vì vậy, đoạn mã chuyển một cấu trúc với các chuỗi được dịch sang các ký tự 8 bit thành một hàm sử dụng rõ ràng hương vị Unicode của hàm. Chắc chắn việc thực hiện thấy rác thải.

Bạn có thể buộc marshaling của từng thành viên chuỗi riêng lẻ với [MarshalAs]. Nhưng nó chỉ đơn giản và hợp lý hơn để làm cho các loại ký tự khớp nhau. Khắc phục:

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

Đó là nó, cảm ơn bạn! – C4p741nZ

1

Cuối cùng tôi đã làm điều đó.

tôi giải quyết vấn đề này bằng cách thêm

[MarshalAs(UnmanagedType.LPWStr)] 

Thuộc tính tới mọi lĩnh vực chuỗi bên trong lớp NetResource tôi. Rất tiếc, tôi không biết tại sao điều này giải quyết vấn đề này ...

Các vấn đề liên quan