2011-05-06 130 views
4

我需要使用C#和P/Invoke的(RapiDll不在那里)写入注册表使用的P/Invoke

我知道如何阅读的关键在于改变WindowsCE的一个系统登录值:

private static string ReadRegKey(UIntPtr rootKey, string keyPath, string valueName,string value) 
    { 
     IntPtr hKey = IntPtr.Zero; 
     if (RegOpenKeyEx(rootKey, keyPath, 0, KEY_READ, out hKey) == 0) 
     { 
      uint size = 1024; 
      uint type = 0; 
      string keyValue = null; 
      StringBuilder keyBuffer = new StringBuilder(); 
      keyBuffer.Append(value); 

      if (RegQueryValueEx(hKey, valueName, IntPtr.Zero, ref type, keyBuffer, ref size) == 0) 
       keyValue = keyBuffer.ToString(); 

      RegCloseKey(hKey); 

      return (keyValue); 
     } 

     return (null); // Return null if the value could not be read 
    } 

任何人都可以帮助我吗? (这是为了改变设备名称btw)

回答

4
RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WJST\WLAN", true); 

// set value of "CDInsert" to 1 
reg.SetValue("CDInsert", 1, RegistryValueKind.DWord); 

// get value of "CDInsert"; return 0 if value not found 
int value = (int)reg.GetValue("CDInsert", 0); 
+0

我试过这种方式,它不断给我提供无法访问的访问权限。也许这是我需要使用P/Invoke方法? – Zarkos 2011-05-06 07:19:32

+0

Oké所以我这样做:)我没有看到,真正的OpenSubKey背后。我搜索了几个小时,为什么我无法改变这个价值。 – Zarkos 2011-05-06 07:42:53

0

为什么你不想从Microsoft.Win32命名空间使用RegistryKey类?

http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey%28v=VS.80%29.aspx

+0

是的,我不知道为什么。但该计划不适合我。我实际上需要更改机器的设备名称,并且我发现它只能在注册表中(或不能?),所以我开始使用RegistryKey类。但后来他开始告诉我使用P/invoke方法......我认为这需要更多的工作 – Zarkos 2011-05-06 07:14:59

0

如果你打算写/读不wow6432节点内部/查询注册表值,如果您使用的框架小于4.0,那么你需要RegistryEX样的P /调用DLL的

为例如,你正在运行在64位应用程序在32位应用程序,由于虚拟化注册表将在32位node.If你需要在64位来创建它,那么你需要使用这些p /调用

希望和祝你成功

+1

在Windows CE中没有“64位”这样的东西。 – ctacke 2014-03-10 14:03:27