Как Вы регистрируете файл COM DLL Win32 в WiX 3?

Примечание: Преобразование в строковое преобразование

Это происходит просто, если вы пытаетесь рассматривать массив как строку:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Массив не может быть просто echo 'd или конкатенируется с строкой, потому что результат не определен. PHP будет использовать строку «Array» вместо массива и вызвать уведомление, чтобы указать, что это, вероятно, не то, что было предназначено, и что вы должны проверять свой код здесь. Вероятно, вы захотите что-то вроде этого:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Или зациклируйте массив:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

Если это уведомление появляется где-то, чего вы не ожидаете, это означает переменную, которую вы мысль - это строка, на самом деле это массив. Это означает, что у вас есть ошибка в коде, которая делает эту переменную массивом вместо ожидаемой строки.

35
задан Peter Mortensen 6 November 2012 в 08:42
поделиться

3 ответа

Самый легкий путь (и Грабят M, будет разглагольствовать и бредить о том, как это неправильно ), должен только использовать SelfRegCost=1 на теге Файла для DLL.

Это неправильно, потому что мы должны явно управлять регистрацией DLL, не позволяя его только для выполнения произвольного кода через DllRegisterServer. Теория, являющаяся, что DLL ничего не должен делать вне помещения соответствующих записей в реестре, когда DllRegisterServer называют. К сожалению, много из них делает больше, чем это, таким образом, саморегистрация могла бы быть единственным способом заставить Вашу установку работать.

Это также неправильно, потому что это означает, что система установки Windows ничего не знает о тех ключах реестра, и что должно и не должно быть там. Это означает восстанавливать, не будет работать, и возможно удаление не вымоется правильно, и т.д.

Иначе, можно генерировать соответствующий код WiX путем указания heat.exe в DLL и интеграции его вывода в текущий проект WiX. Вы получите разнообразие Класса, ProgID, TypeLib и тегов Реестра. Вы, возможно, должны вручную отредактировать тот вывод, чтобы заставить его компилировать.

я надеюсь, что это помогает.

41
ответ дан Peter Mortensen 27 November 2019 в 06:50
поделиться

Это не просто я, который будет разглагольствовать и бредить о том, как SelfReg является злым. SDK MSI дает Вам список семь причины, почему не использовать SelfReg.

Пример:

<Component Id="Component" Guid="*">
    <File Source="ComServer.dll">
        <Class Id="PUT-CLSID-HERE" Context="InprocServer32" ThreadingModel="apartment" Description="Your server description">
            <ProgId Id="Your.Server.1" Description="Your ProgId description">
                <ProgId Id="Your.Server" Description="Your ProgId description" />
            </ProgId>
        </Class>

        <Class Id="PUT-PROXY-CLSID-HERE" Context="InprocServer32" ThreadingModel="both" Description="Your server Proxies, assuming you have them">
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface1" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface2" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface3" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface4" />
        </Class>
    </File>
</Component>

В конечном счете, ответ Трои все корректен.

24
ответ дан Peter Mortensen 27 November 2019 в 06:50
поделиться

Вы могли попытаться использовать программу heat.exe и затем сослаться на фрагмент в Вашем коде wix.

 heat.exe file <filename> -out <output wxs file>

Как в:

 heat.exe file my.dll -out my.wxs
13
ответ дан Adam Tegen 27 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: