1

kernel32.dll インポートと関数 SetComputerName を介してホスト名を変更しようとしました。SetComputerName 関数

メインクラス:

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) ハンドルが無効です。

ハンドルのどこが悪いのかわからない。

4

1 に答える 1

1

あなたはそれを間違っているだけです。SetComputerName() の戻り値の型は int ではなく bool です。関数が失敗した場合は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);
于 2013-11-18T15:29:51.307 に答える