2013-12-11 77 views
1

正在嘗試查找網絡上的所有計算機。以下代碼對Win7-32​​bit工作正常,但Win7-64bit給出以下錯誤。使用NetServerEnum()查找網絡上的所有計算機()

NetServerEnum()正在返回代碼-6118。

public sealed class NetworkBrowser 
{ 
    [DllImport("Netapi32", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurityAttribute] 
    public static extern int NetServerEnum(
     string serverName, 
     int dwLevel, 
     ref IntPtr pBuf, 
     int dwPrefMaxLen, 
     out int dwEntriesRead, 
     out int dwTotalEntries, 
     int dwServerType, 
     string domain, 
     out int dwResumeHandle 
     ); 

    [DllImport("Netapi32", SetLastError = true), SuppressUnmanagedCodeSecurity] 
    public static extern int NetApiBufferFree(IntPtr pBuf); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct ServerInfo100 
    { 
     internal int sv100_platform_id; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     internal string sv100_name; 
    } 

    public static ArrayList GetNetworkComputers() 
    { 
     ArrayList networkComputers = new ArrayList(); 
     const int MAX_PREFERRED_LENGTH = -1; 
     int SV_TYPE_WORKSTATION = 1; 
     int SV_TYPE_SERVER = 2; 
     IntPtr buffer = IntPtr.Zero; 
     IntPtr tmpBuffer = IntPtr.Zero; 
     int entriesRead; 
     int totalEntries; 
     int resHandle; 
     int sizeofInfo = Marshal.SizeOf(typeof(ServerInfo100)); 


     try 
     { 
      int ret = NetServerEnum(null, 100, ref buffer, 
            MAX_PREFERRED_LENGTH, out entriesRead, out totalEntries, 
            SV_TYPE_WORKSTATION | SV_TYPE_SERVER, null, out resHandle); 

      if (ret == 0) 
      { 
       for (int i = 0; i < totalEntries; i++) 
       { 
        tmpBuffer = new IntPtr((int)buffer +(i * sizeofInfo)); 

        ServerInfo100 svrInfo = (ServerInfo100) 
               Marshal.PtrToStructure(tmpBuffer, 
                     typeof(ServerInfo100)); 
        networkComputers.Add(svrInfo.sv100_name); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      return null; 
     } 
     finally 
     { 
      NetApiBufferFree(buffer); 
     } 
     return networkComputers; 
    } 
} 

我對谷歌搜索了很多,但沒有找到任何解決方案,這種情況。

回答

-1

INT RET = NetServerEnum(NULL,100,參考緩衝液, MAX_PREFERRED_LENGTH,出entriesRead,出爲totalEntries, SV_TYPE_WORKSTATION | SV_TYPE_SERVER,空出resHandle);

您需要域名傳遞給初始化
INT RET = NetServerEnum(NULL,100,參考緩衝液, MAX_PREFERRED_LENGTH,出entriesRead,出爲totalEntries, SV_TYPE_WORKSTATION | SV_TYPE_SERVER,則domainName,出resHandle);

而且它完美

感謝

0

可能,這將有助於

http://social.msdn.microsoft.com/Forums/windows/en-US/1107608f-ef56-4719-a5e5-f6966d111043/win32-api-compatibility-on-windows-7-64-bit?forum=winforms

它說 「當youset應用程序的目標平臺是 'AnyCPU',BYT默認它將在64位計算機上以64位模式運行,並在32位計算機上以32位模式運行。現在,假設您的應用程序以64位模式運行,並且在某個時間點,它必須調用某個AP我或特定於32位計算機的代碼(如PrintDlg API)。但是,由於您的進程已經以64位模式運行,因此您的32位代碼無法加載,因此會失敗。

BYT目標平臺設置爲x86的 - 你的應用程序將始終在32位模式下在32臺& 64位計算機上運行。因爲,應用程序總是以32位模式運行,所以32位組件或API也可以毫無問題地被調用。現在,唯一的問題是 - 如果你有任何64位特定組件,它不能被調用(因爲64位代碼不能在32位進程中運行)。但我不認爲這可能是一個問題,你是專門設計您的應用程序爲64位的機器。」

+0

我試圖建立使用所有平臺目標 - 任何CPU,x86。但它仍然沒有工作。 – Akshay

1

我想,這正是回答你的問題。

Retrieving a list of network computer names using C# - Code project article comment

錯誤和分辨率 - designmaistro - 25-Feb-14 23:46

我讀過,有些人在基於x64的系統上使用這段代碼時遇到了問題。這可能與指針操作,更準確地說這條線是其中代碼遊:

tmpBuffer = new IntPtr((int)buffer + (i * sizeofINFO));

由於x64系統上的地址空間的寬度爲64位,則代碼應該更改爲以下:

tmpBuffer = new IntPtr((long)buffer + (i * sizeofINFO));

這個改變後,一切都應該正常工作。 此致敬禮!

0

你的功能是通過使用這個註解完全工作:

[DllImport("Netapi32", CharSet = CharSet.Unicode, SetLastError = true)] 

代替:

[DllImport("Netapi32", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurityAttribute] 

問候。

相關問題