Should DWORD map to int or uint?

后端 未结 7 1987
抹茶落季
抹茶落季 2021-02-06 22:58

When translating the Windows API (including data types) into P/Invoke, should I replace DWORD with int or uint?

It\'s normally unsigned, but I

相关标签:
7条回答
  • 2021-02-06 23:17

    It's unsigned so map it to uint.

    0 讨论(0)
  • 2021-02-06 23:17

    The CLS compliance warning applies only if the P/Invoke method is visible outside the assembly, which generally means the call is public. If the method is not externally visible, then it is acceptable to use uint.

    0 讨论(0)
  • 2021-02-06 23:18

    Sadly,read Registry must use int otherwise throw exception.this microsoft code:

    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.");
          } 
        }
    }
    

    although release is REG_DWORD

    0 讨论(0)
  • 2021-02-06 23:19

    According to official Platform invoke data types mapping table DWORD corresponds to System.UInt32 in C#.

    0 讨论(0)
  • 2021-02-06 23:27

    Use int. Reason being, if I change "AutoRestartShell" with a uint variable:

    regKey.SetValue("AutoRestartShell", uintVariable);
    

    the data type in the Registry Editor changes to "REG_SZ". If I ask for that value to be returned with:

    regKey.GetValue("AutoRestartShell");
    

    a string gets returned.

    If, however, I change "AutoRestartShell" with an int variable:

    regKey.SetValue("AutoRestartShell", intVariable);
    

    The data type stays as "REG_DWORD".

    Why does this happen? No idea. All I know is that it does. Logic certainly would tell us that uint should be used but that changes the data type which we don't want.

    0 讨论(0)
  • 2021-02-06 23:34

    A DWORD is, by (Microsoft's) definition, an unsigned 32-bit integer. It should map to whichever type your compiler uses to represent that.

    These days it's most likely an unsigned int, but that's not a portable implementation. I know you're using C#, but to give you an example in a language I'm more familiar with, a typical implementation in C might be:

    #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
    
    0 讨论(0)
提交回复
热议问题