web-dev-qa-db-ja.com

DWORDはintまたはuintにマップする必要がありますか?

Windows API(データ型を含む)をP/Invokeに変換する場合、DWORDをintまたはuintに置き換える必要がありますか?

通常は署名されていませんが、代わりにあらゆる場所でintを使用している人がいます(CLSの警告だけですか? 。NET Framework自体でもthis です) 、だから、どれが正しいものなのか本当によくわかりません。

30
Mehrdad

さて MSDNによるとDWORDは、0〜4294967295の範囲の符号なし整数です。

理想的には、uintではなくintに置き換える必要があります。

ただし、uintはCLSに準拠していないため、メソッドが公開されている場合はintを使用して変換を行う必要があります。その結果、メソッドがアセンブリの外部で使用されていない場合、internalではなくpublicとしてマークする必要があります。その後、uintを使用できるようになります。

43
ChrisF

Intを使用します。 "AutoRestartShell"int変数で変更した場合の理由:

regKey.SetValue("AutoRestartShell", uintVariable);

レジストリエディターのデータ型が"REG_SZ"に変更されます。その値が返されるように要求する場合:

regKey.GetValue("AutoRestartShell");

stringが返されます。

ただし、"AutoRestartShell"int変数で変更した場合:

regKey.SetValue("AutoRestartShell", intVariable);

データ型は"REG_DWORD"のままです。

なぜこれが起こるのですか?わからない。私が知っているのは、それがするということです。ロジックは、確か​​にuintを使用する必要があることを教えてくれますが、それは望まないデータ型を変更します。

2
Rehaan

署名されていないため、uintにマップします。

2
David Heffernan

DWORDは、(Microsoftの)定義によると、符号なし32ビット整数です。コンパイラがそれを表すために使用する型にマップする必要があります。

最近では、おそらくunsigned intですが、移植性のある実装ではありません。 C#を使用していることは知っていますが、私が使い慣れた言語の例を挙げると、Cでの典型的な実装は次のようになります。

#if defined(SOME_HARDWARE_IMPLEMENTATION)
#define DWORD unsigned int
#Elif #defined(SOME_OTHER_IMPLEMENTATION)
#define DWORD unsigned long
#Elif #defined(YET_ANOTHER_IMPLEMENTATION)
#define DWORD something_else
#else
#error Unsupported hardware; cannot map DWORD
#endif
1
Adam Liss

CLS準拠の警告は、アセンブリの外部でP/Invokeメソッドが表示されている場合にのみ適用されます。これは一般に、呼び出しがパブリックであることを意味します。メソッドが外部から見えない場合は、uintを使用してもかまいません。

1
Peter O.

悲しいことに、Read Registryはintを使用する必要があります。そうでなければ、例外をスローします。このMicrosoftコード:

private static void Get45or451FromRegistry()
{
    using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) {
        if (ndpKey != null && ndpKey.GetValue("Release") != null) {
            Console.WriteLine("Version: " + CheckFor45DotVersion((int) ndpKey.GetValue("Release")));
        }
      else {
         Console.WriteLine("Version 4.5 or later is not detected.");
      } 
    }
}

リリースはREG_DWORDですが

0
fe263