我尝试通过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) 句柄无效。
不知道手柄有什么问题。
答案 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);