代码之家  ›  专栏  ›  技术社区  ›  JCCyC

如何从C.NET调用netusermodalsget()?

  •  0
  • JCCyC  · 技术社区  · 16 年前

    编辑: 追随 NetUserModalsGet() returns strings incorrectly for C#.NET

    我正在努力处理此函数的dll声明:

    NET_API_STATUS NetUserModalsGet(
      __in   LPCWSTR servername,
      __in   DWORD level,
      __out  LPBYTE *bufptr
    );
    

    (参考文献: http://msdn.microsoft.com/en-us/library/aa370656%28VS.85%29.aspx )

    我试过这个:

    private string BArrayToString(byte[] myArray)
    {
        string retVal = "";
        if (myArray == null)
            retVal = "Null";
        else
        {
            foreach (byte myByte in myArray)
            {
                retVal += myByte.ToString("X2");
            }
        }
        return retVal;
    }
    
    ...
    
    [DllImport("netapi32.dll")]
    public static extern int NetUserModalsGet(
      string servername,
      int level,
      out byte[] bufptr
    );
    
    [DllImport("netapi32.dll")]
    public static extern int NetApiBufferFree(
      byte[] bufptr
    );
    
    ...
    
    int retVal;
    byte[] myBuf;
    
    retVal = NetUserModalsGet("\\\\" + tbHost.Text, 0, out myBuf);
    myResults.Text += String.Format("retVal={0}\nBuffer={1}\n", retVal, BArrayToString(myBuf));
    retVal = NetApiBufferFree(myBuf);
    

    我得到的返回值是1231(无法到达网络位置),无论我使用的是IP地址还是毫无疑问联机的机器的netbios名称,甚至是我自己的。编辑时:即使我没有在主机名前面加上一个“\”也会发生这种情况。

    我知道,我做错了事情,我们甚至都不要开始讨论如何声明爆炸的返回缓冲区(它可以有许多不同的长度,ewww)。

    2 回复  |  直到 13 年前
        1
  •  1
  •   Gonzalo    16 年前

    pinvoke.net (他们还有一些关于如何使用它的示例代码):

       [DllImport("netapi32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        static extern uint NetUserModalsGet(
            string server,
            int level,
            out IntPtr BufPtr);
    
        2
  •  0
  •   Alexander    13 年前

    最好用一下 System.Text.Encoding.ASCII.GetBytes(somestring_param) System.Text.Encoding.ASCII.GetString(byte_array) 而不是你自己的常规 BArrayToString .

    希望这有帮助。