2013-05-31 67 views
1

我无法检索软件的Installdir。我已经尝试过GetValue,甚至OpenSubKey,但每次我得到一个NULL。我使用VS2008,.Net 3.5,64位机器,32位进程设置。使用C获取注册表值#

private string GetInstallPath() 
{ 
    string keyValue = string.Empty; 
    Object key = Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\My Company\\My Tool", "Installdir", null); 
    ... 
} 

虽然在那里有一个有效的字符串,但键仍返回NULL。等价代码在VC++中起作用。请提供您对此问题的见解。我为这个所谓的简单任务做错了什么?我不能使用'Hive',因为它是4.0标准。代码级别的帮助,而不是链接将有所帮助。

VC++相当于

HKEY hkey = NULL; 
LSTATUS status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\My Company\\My Tool\\", 0, KEY_READ, &hkey); 

if (status == ERROR_SUCCESS) 
{ 
    DWORD type; 
    char buff[ 100 ]; 
    DWORD numBytes = sizeof(buff); 
    if (RegQueryValueExA(hkey, REGISTRY_ENTRY, NULL, &type, (LPBYTE) buff, &numBytes) == ERROR_SUCCESS) 
{ 
... 
} 
+0

添加了VC++等价物作为编辑。 –

+0

@santra_a我发布了工作的c#实际上会经过并找到一个定义,然后将修改UninstallString来修复应用程序。我相信那是你寻找的正确的东西? – Greg

回答

4

你提到你的机器是64,你的程序是32位,除非我误解。考虑到您的环境,我要检查的首要任务是确保密钥存在于64位节点HKCU\Software\My Company\...中,而不是在32位节点HKCU\Software\Wow6432Node\My Company\...中,如果您的密钥存在于32位节点中,则需要确保您的应用是一个32位的应用程序,否则,您将需要确保您的应用程序是64位或您不会找到密钥。

下面的代码为我工作,运行在64位,并找到Wow6432Node之外的关键。我不明白为什么你不能用户“蜂巢”,它工作在两个3.5和4.0

RegistryKey regKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\VisualStudio\\10.0"); 

if (regKey != null) 
{ 
    object val = regKey.GetValue("FullScreen"); 
} 

更新: 下面还为我工作,运行.NET 3.5,如果它不是一个平台(86 VS 64)的问题,那么它可能是一个权限问题,请确保您的应用程序在其下运行的背景下访问注册表项(试运行的应用程序作为管理员,甚至造成系统)

object test = Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\VisualStudio\\10.0", "FullScreen", null); 
+0

您希望我检查的第一件事是错误点。我不得不在“任何CPU”平台目标中将我的代码显式设置为'x86'。这是因为我试图获取的信息是32位,因此在Wow6432中。 –

+0

@santra_a很高兴听到它解决了,是的,AnyCPU将在64位系统上以64位运行,在x86系统上以32位运行,除非初始入口程序集另有说明:) – Jason