¿Debería DWORD map to int o uint?


Al traducir la API de Windows (incluidos los tipos de datos) a P/Invoke, ¿debo reemplazar DWORD por int o uint?

Normalmente no tiene signo, pero veo gente usando int en todas partes (¿es solo por la advertencia de CLS? incluso el propio.NET Framework hace esto), por lo que nunca estoy realmente seguro de cuál es el correcto para usar.

Author: Mehrdad, 2011-07-17

6 answers

Bien según el MSDN DWORD es un entero sin signo con un rango de 0 a 4294967295.

Así que idealmente deberías reemplazarlo con uint en lugar de int.

Sin embargo, como ha visto uint no es compatible con CLS, por lo que si su método es públicamente visible, debe usar int y hacer la conversión. El corolario de esto es que si su método no se usa fuera de su ensamblaje, debe marcarlo como internal en lugar de public. Entonces podrás usar un uint.

 41
Author: ChrisF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-27 11:48:31

Es unsigned tan mapa a uint.

 2
Author: David Heffernan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-17 17:38:27

Use int. La razón es, si cambio "AutoRestartShell" con una variable uint:

regKey.SetValue("AutoRestartShell", uintVariable);

El tipo de datos en el Editor del Registro cambia a "REG_SZ". Si pido que se devuelva ese valor con:

regKey.GetValue("AutoRestartShell");

Se devuelve una cadena .

Si, sin embargo, cambio "AutoRestartShell" por una variable int :

regKey.SetValue("AutoRestartShell", intVariable);

El tipo de datos permanece como "REG_DWORD".

¿por Qué sucede esto? Ni idea. Todo lo que sé es que lo hace. La lógica ciertamente nos diría que se debe usar uint, pero eso cambia el tipo de datos que no queremos.

 2
Author: Rehaan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 17:34:44

Una DWORD es, por definición (de Microsoft), un entero de 32 bits sin signo. Debería asignarse a cualquier tipo que su compilador utilice para representarlo.

En estos días lo más probable es que sea un int sin firmar, pero eso no es una implementación portátil. Sé que estás usando C#, pero para darte un ejemplo en un lenguaje con el que estoy más familiarizado, una implementación típica en C podría ser:

#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
Author: Adam Liss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-17 17:38:58

La advertencia de cumplimiento de CLS se aplica solo si el método P/Invoke es visible fuera del ensamblado, lo que generalmente significa que la llamada es pública. Si el método no es visible externamente, entonces es aceptable usar uint.

 1
Author: Peter O.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-17 17:39:28

Tristemente,read Registry debe usar int de lo contrario lanzar excepción.este código de 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.");
      } 
    }
}

Aunque la versión es REG_DWORD

 0
Author: fe263,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-12 02:22:02