The error you are getting is due to UAC permission error. Run the
program using Administrator mode.
If you still get the same error try this :
using System.ComponentModel;
int ret = RegOpenKeyEx(hKey, keyPath, 0, KEY_ALL_ACCESS |
KEY_WOW64_32KEY, out hKey);
if (ret != 0)
{
string OSerrorMessage = new Win32Exception(ret).Message;
}
BTW, the following link mentions that any 32 bit application's
registry access will be redirected to wow6432node by windows :
http://www.windowsitpro.com/article/internals-and-architecture/what-s-the-wow6432node-under-the-hkey_local_machine-software-registry-subkey-.aspx
On Jun 16, 8:22 pm, Chris McClintock <[email protected]> wrote:
> Hi, I am having problems with RegDeleteKeyEx function available in
> advapi.dll on Win7 64bit and c# - basically i am trying to delete a
> value from HKLM\Software\Wow6432Node\Test but cannot figure out why I
> am getting error_success=2 (file not found I believe) when it should
> be 0 and the reg value not being deleted...here comes the code....:
>
> I have the following in a codefile to try and delete the reg value;
>
> regload rl = new regload();
> bool del = rl.WoWDel("HKLM", @"Software\Test", "TESTValue");
>
> This being the main code:
>
> using System;
> using System.Runtime.InteropServices;
> using System.Text;
> using Microsoft.Win32;
>
> namespace AdvRegistry
> {
> public class regload
> {
>
> [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
> public static extern int RegOpenKeyEx(
> UIntPtr hKey,
> string subKey,
> int ulOptions,
> int samDesired,
> out UIntPtr hkResult);
>
> [DllImport("advapi32.dll", EntryPoint = "RegDeleteKeyEx",
> SetLastError = true)]
> public static extern int RegDeleteKeyEx(
> UIntPtr hKey,
> string lpSubKey,
> int samDesired,
> int Reserved);
>
> [DllImport("advapi32.dll", SetLastError = true)]
> public static extern int RegCloseKey(
> UIntPtr hKey);
>
> public static int KEY_WOW64_64KEY = 0x0100;
> public static int KEY_WOW64_32KEY = 0x0200;
> public static int KEY_READ = 0x20019;
> public static int KEY_WRITE = 0x20006;
> public static int KEY_ALL_ACCESS = 0xF003F;
> public static UIntPtr HKEY_LOCAL_MACHINE = new
> UIntPtr(0x80000002u);
> public static UIntPtr HKEY_CURRENT_USER = new
> UIntPtr(0x80000001u);
>
> public bool WoWDel(string RegRoot, string RegPath, string
> RegItem)
> {
> if (RegRoot == "HKCU") DelWowReg(HKEY_CURRENT_USER,
> RegPath, RegItem);
> else if (RegRoot == "HKLM") DelWowReg(HKEY_LOCAL_MACHINE,
> RegPath, RegItem);
> else return false;
> return true;
> }
>
> private static int DelWowReg(UIntPtr hKey, string keyPath,
> string valueName)
> {
> int i = 9999;
>
> if (RegOpenKeyEx(hKey, keyPath, 0, KEY_ALL_ACCESS |
> KEY_WOW64_32KEY , out hKey) == 0)
> {
>
> // int wlength = value.Length + 1;
> i = RegDeleteKeyEx(hKey, valueName, KEY_WOW64_32KEY,
> 0);
> RegCloseKey(hKey);
> return i;
>
> }
> return i;
> }
>
> }
>
> }
>
> Where did I go wrong?
>
> many thanks for the help, Chris.