Параметр WiX RegistryValue равен нулю (Значение = "") - PullRequest
0 голосов
/ 10 августа 2011

Я работаю над проектом WiX в течение некоторого времени, и использование значений реестра, которые инициализирует моя установка, оказалось «интересным».Я ищу проверку работоспособности, пожалуйста.

У меня есть следующая строка в моем скрипте WiX, которая создает значение реестра:

<RegistryValue Type="multiString" Name="polling_manifest" Value="" />

Это создает значение реестра с данными, которыевыглядит следующим образом (из regedit / export):

"polling_manifest"=hex(7):00,00,00,00

, что для меня выглядит как строка [2] с двумя пустыми строками.В действительности, если вы откроете это значение реестра с помощью чего-то вроде:

    public static string[] pollingManifestValue
    {
        get
        {
            return (string[])RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
                .OpenSubKey(AppSettingsGet("RegPathKeyConary"))
                .GetValue(AppSettingsGet("rTISRegKeyPollingManifest"));
        }

        set
        {
            RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
                .OpenSubKey(AppSettingsGet("RegPathKeyConary"), true)
                .SetValue(AppSettingsGet("rTISRegKeyPollingManifest"), value);
        }
    }

pollingManifestValue возвращается как ноль.Следовательно, весь мой код, который обращается к этой конструкции, должен иметь код типа «сначала проверять на нулевое значение, а затем обращаться к свойствам».

Я понимаю, что эти проверки - правильная вещь, и я не ищучтобы быть более ленивым программистом здесь.Я ищу мысли и предложения от более опытных, чем я, с глубоким волшебством WiX, потому что мне кажется, что я делаю это не оптимально.Любое руководство по проверке кода / использованию приветствуется, и я заранее благодарен вам.

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Внутренне REG_MULTI_SZ (Type="multiString") значения представлены последовательностью строк с нулевым символом в конце, оканчивающихся пустой строкой.

Хотя эта страница MSDN ясно заявляет, что невозможно включить строку нулевой длины в последовательность , такие инструменты, как WiX, позволяют записывать пустые строки в реестр.Редактор реестра, при правильном отображении таких значений в некоторых местах, удалит пустые строки перед сохранением.

Итак, ваш пример

<RegistryValue Type="multiString" Name="polling_manifest" Value="" />

, который также можно записать следующим образом, чтобы сделать его намерение более понятным

<RegistryValue Type="multiString" Name="polling_manifest">
  <MultiStringValue></MultiStringValue>
</RegistryValue>

будет записано в реестр в виде пустой строки, за которой следует символ \ 0, за которым следует завершающий последовательность символ \ 0.С каждым символом, представленным двумя байтами, вся последовательность экспортируется как "polling_manifest"=hex(7):00,00,00,00.

Во время тестирования этого я обнаружил, что .NET, по крайней мере в версии 4, не использует обработку строки в стиле c длячтение значений REG_MULTI_SZ и может четко обрабатывать пустые строки.Использование кода, подобного вашему, однозначно вернул строковый массив, содержащий один пустой строковый элемент.

Я заметил, что вы используете 64-битное представление реестра в своем коде, однако неясно, будет ли записано ваше значение в этот реестр.Посмотреть.Кроме того, путь к ключу и имя значения считываются из конфигурации;Вы уверены, что они верны?

0 голосов
/ 10 августа 2011

Создать запись реестра, используя этот код

<RegistryKey Id="ServiceName" Action="createAndRemoveOnUninstall" Key="SOFTWARE\ProductName\[ProductCode]\FeatureName" Root="HKLM">
    <RegistryValue Id="ServiceName" Type="string" Name="ABC" Value="[SERVICENAME]"></RegistryValue>
    <RegistryValue Id="ServiceInstallLocation" Type="string" Name="ServiceInstallLocation" Value="[INSTALLLOCATION2]"></RegistryValue>
</RegistryKey>

Для чтения реестра вы можете использовать прямой код, как показано ниже

string processor = System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
processor = processor.Substring(processor.Length - 2, 2);

if (processor == "86")
{
    regkey = Registry.LocalMachine.OpenSubKey("Software\\ABC company");
}
else
{
    regkey = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\ABC company");
}

Затем получить значения

Registry.GetValue(regkey + "\\Services", "ServiceName", "0")

Если он возвращает «0», то значение не существует, иначе он даст вам имя службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...