kernel32.dll SetComputerName win32错误6

时间:2013-11-18 13:20:22

标签: c# runtime-error rename netbios

我尝试通过kernel32.dll import和函数SetComputerName更改主机名。 SetComputerName function

Mainclass:

namespace Castell
{
  class Program
  {
      private static string hostname { get; set; }
      setHostname();
      private static void setHostname()
      {
         hostname = "TEST123456789";
         int errorcode = ImportDLL.SetComputerName(hostname);
         Console.WriteLine(Marshal.GetLastWin32Error());
      }
  }
}

导入类:

namespace Castell
{
    class ImportDLL
    {
        [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int SetComputerName(string hostname);
    }
}

Marshal.GetLastWin32Error()的结果为“6”。这意味着: ERROR_INVALID_HANDLE 6(0x6) 句柄无效。

不知道手柄有什么问题。

1 个答案:

答案 0 :(得分:1)

你只是做错了。 SetComputerName()的返回类型是bool,而不是int。当函数失败时,它返回 false 。 winapi中的硬规则是,您应该只在函数失败时获取错误代码。或者换句话说,当函数成功时,Windows不会将错误代码显式设置为0。只有然后使用Marshal.GetLastWin32Error()来检索错误代码。否则由Win32Exception类构造函数自动完成。这使得此代码有效:

  public static void SetHostname(string hostname)
  {
     if (!SetComputerName(hostname)) {
         throw new System.ComponentModel.Win32Exception();
     }
  }

  [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  private static extern int SetComputerName(string hostname);