需要帮助使Registry.GetValue正常工作

时间:2015-07-28 15:29:51

标签: vb.net winforms visual-studio-2010 windows-7 setup-deployment

我有一个不再有效的简单安装项目,似乎是Windows更新的原因。我在Windows 7上使用Visual Studio 2010.该项目是64位。它仍适用于某些计算机,但它不适用于最近有更新的任何计算机。

以下是原始代码:

    Dim appPath As String = Registry.GetValue("HKEY_CURRENT_USER\SOFTWARE\Our Company Inc.\SoftwareName.exe", "Path", "Not Found")

    appPath &= "Colorbar.col"

    Dim sid : sid = "S-1-1-0"
    Dim objWMI : objWMI = GetObject("winmgmts://./root\cimv2")
    Dim objSID : objSID = objWMI.Get("Win32_SID='" & sid & "'")

    Dim userAccount As String = objSID.AccountName
    Dim fileInfo As IO.FileInfo = New IO.FileInfo(appPath)
    Dim fileAcl As New FileSecurity

    fileAcl.AddAccessRule(New FileSystemAccessRule(userAccount, FileSystemRights.FullControl, AccessControlType.Allow))

    fileInfo.SetAccessControl(fileAcl)

我已将“Path”和“[TARGETDIR]”的键值对放在注册表编辑器中,并在安装和提交自定义操作中获得此安装程序类(上面的代码)的输出。

以前工作的代码现在返回“调用目标抛出了异常 - > C:\ Windows \ SYSWOW64 \ Colorbar.col”

当出现此消息且路径正确时,我检查了注册表,因此我不知道SYSWOW64的来源。

我尝试使用此代码更改获取appPath:

  Dim regKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64)
    regKey = regKey.OpenSubKey("SOFTWARE\Our Company Inc.\SoftwareName.exe")
    Dim appPath As String = regKey.GetValue("Path").ToString

这将返回“未将对象引用设置为对象实例”错误。

我已经制作了测试Windows窗体应用程序并将两个版本的代码放在按钮事件中。一切都按预期工作。任何想法为什么代码不再在安装项目中工作以及我能做些什么才能让它再次工作?

提前致谢。

1 个答案:

答案 0 :(得分:0)

最后让它再次运作。我通过使用自定义操作的CustomActionData并将其设置为:

来使用注册表

/ name =“[TARGETDIR] \”

然后我可以使用以下代码行在我的安装程序类中访问它:

Dim appPath As String = Context.Parameters.Item(“name”)

设置路径后,其他所有内容都按预期工作。最终代码如下所示:

Public Overrides Sub Commit(ByVal stateSaver As System.Collections.IDictionary)
    MyBase.Commit(stateSaver)
    Dim appPath As String = Context.Parameters.Item("name")
    appPath = appPath.Remove(appPath.Length - 1)
    appPath &= "Colorbar.col"

    Dim sid : sid = "S-1-1-0"
    Dim objWMI : objWMI = GetObject("winmgmts://./root\cimv2")
    Dim objSID : objSID = objWMI.Get("Win32_SID='" & sid & "'")

    Dim userAccount As String = objSID.AccountName
    Dim fileInfo As IO.FileInfo = New IO.FileInfo(appPath)
    Dim fileAcl As New FileSecurity

    fileAcl.AddAccessRule(New FileSystemAccessRule(userAccount, FileSystemRights.FullControl, AccessControlType.Allow))

    fileInfo.SetAccessControl(fileAcl)
End Sub