2009-01-14 8 views
0

J'ai ce P/Invoke RegSetValueExW qui définit la valeur de la clé de registre. en C#Comment passer un (byte [] lpData) avec une valeur entière à RegSetValueExW P/Invoke

[DllImport("coredll.dll", EntryPoint = "RegSetValueExW")] 
public static extern int RegSetValueExW(uint hKey, string lpValueName, 
      uint lpReserved, 
      uint lpType, 
      byte[] lpData, 
      uint lpcbData); 

J'ai un problème avec le 4ème octet de param [] lpdata. Je dois passer un DWORD avec une valeur de 5 (int) dedans. Tout est OK si je passe une chaîne (REG_SZ), juste besoin de convertir en utilisant la fonction GetBytes.

Si j'appelle GetBytes (« 5 »), il convertit en valeur ascii de 53 il écrit 53 sur la valeur de Registre au lieu de 5

Répondre

2

Je dois commencer par demander pourquoi vous utilisez PInvoke ici quand il existe déjà une méthode pour définir des valeurs de Registre dans la classe Microsoft.Win32.RegistryKey? Ou êtes-vous coincé en utilisant une ancienne version du Compact Framework?

En supposant que vous ayez une bonne raison pour PInvoke, la réponse la plus simple est simplement de surcharger la déclaration PInvoke pour les valeurs entières. à savoir:

[DllImport("coredll.dll", EntryPoint = "RegSetValueExW")] 
public static extern int RegSetValueExW(uint hKey, string lpValueName, 
     uint lpReserved, 
     uint lpType, 
     ref int lpData, 
     uint lpcbData); 
0

Si vous devez passer une valeur entière, vous pouvez simplement le jeter à l'octet

byte[] lpData = new byte[] { (byte)5 }; 
+0

Ceci est dangereux - il ne fonctionnera certainement pas si la valeur est supérieure à 255. –

+0

Mais les entiers sont 4 octets, pourquoi créer un tableau de 1 octet? Aussi, que se passe-t-il si votre valeur entière est 4935325? Aussi, pourquoi lancez-vous un int, 5, à int quand vous créez un tableau d'octets? –

+0

err, désolé mon erreur quand j'écrivais. Je voulais le convertir en octets merci. oui c'est dangereux mais c'est le moyen le plus rapide qui me soit venu à l'esprit. –

1

Utilisation REG_DWORD au lieu de REG_SZ puis utilisez BitConverter.GetBytes (Int32) pour convertir l'int un octet [].

Questions connexes