0

У меня есть простой проект, который больше не работает, и похоже, что причиной является обновление Windows. Я использую Visual Studio 2010 в Windows 7. Проект имеет 64 бит. Он по-прежнему работает на некоторых компьютерах, но не работает на компьютерах, которые недавно обновлялись.Нужна помощь в правильном использовании Registry.GetValue

Вот исходный код:

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) 

Я положил ключ значение пары «Путь» и «[TARGETDIR]» в редакторе реестра и выводимую из этого инсталлятор класса (приведенный выше код) в пользовательских действиях Install and Commit.

Этот код, который используется для работы в настоящее время возвращает «Исключение было брошено в целью вызова -> 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 Form и поместил обе версии кода в событие кнопки. Все работает так, как ожидалось. Любые идеи, почему код больше не работает в проекте настройки и что я могу сделать, чтобы заставить его работать снова?

Заранее спасибо.

ответ

0

И наконец, он снова работает. Я получил вокруг с помощью реестра с помощью CustomActionData настраиваемого действия и установив его:

/имя = «[TARGETDIR] \»

Я был тогда в состоянии получить доступ к нему в моем классе инсталлятора с помощью этой линии код:

Dim AppPath As String = Context.Parameters.Item ("имя")

Как только путь был установлен, все остальное работает, как ожидалось. Окончательный код выглядит так:

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 
Смежные вопросы