cx_Freeze msi после установки

У меня есть пакет, который я пытаюсь обернуть в MSI, который требует, чтобы DLL была зарегистрирована с параметрами командной строки после установки. используя cx_Freeze, я могу добавить настраиваемое действие и добавить его в последовательность выполнения, которая будет выполняться во время установки, однако независимо от того, где в последовательности я его разместил, команда завершается ошибкой, если я не скопирую файлы в целевой каталог установки перед запуском установщика.

мой установочный файл:

#!python3

import os, sys, shutil, platform
from cx_Freeze import setup

command_line = 'regsvr32.exe /s /i:"stuff_here" MyDLL.dll'

files = ['MyDLL.dll']

if platform.architecture()[0] == '32bit':
    builddir = 'build/bdist.win32/msi'
else:
    builddir = 'build/bdist.win-amd64/msi'

os.makedirs(builddir, exist_ok=True)

for file in files:
    shutil.copyfile(file, os.path.join(builddir, file))

if 'bdist_msi' in sys.argv:
    sys.argv += ['--initial-target-dir', '[ProgramFilesFolder]DLL_Thing']

custom_action_table = []
if command_line != '':
    custom_action_table.append(
        # action to take to register DLL
        (
            'RegisterDLLs',                 # action key name
            34,                             # type (EXE file having a path referencing a directory.)
            'TARGETDIR',                    # 
            command_line,                   # command line
        ),
    )

install_execute_sequence_table = []
if command_line != '':
    install_execute_sequence_table.append(
        # call regsvr after rest of product finishes installing.
    (
            'RegisterDLLs', # action key name
            None,           # condition
            6501,           # sequence
        ),
    )

# Change some default MSI options and specify the use of the above defined tables
bdist_msi_options = {
    'data': {
        'CustomAction': custom_action_table,
        'InstallExecuteSequence': install_execute_sequence_table
    },
}

setup(  name = 'DLL Thing',
        version = '1.0.0',
        description = 'DLL Thing',
        options = {'build_exe': {'include_files': files}, 'bdist_msi': bdist_msi_options,},
    )

чтение моей таблицы последовательности установки:

LaunchConditions        100
FindRelatedProducts     200
AppSearch       400
A_SET_TARGET_DIR    TARGETDIR=""    401
CCPSearch   NOT Installed   500
RMCCPSearch NOT Installed   600
ValidateProductID       700
CostInitialize      800
FileCost        900
IsolateComponents       950
CostFinalize        1000
SetODBCFolders      1100
MigrateFeatureStates        1200
InstallValidate     1400
RemoveExistingProducts      1450
InstallInitialize       1500
AllocateRegistrySpace   NOT Installed   1550
ProcessComponents       1600
UnpublishComponents     1700
MsiUnpublishAssemblies      1750
UnpublishFeatures       1800
StopServices    VersionNT   1900
DeleteServices  VersionNT   2000
UnregisterComPlus       2100
SelfUnregModules        2200
UnregisterTypeLibraries     2300
RemoveODBC      2400
UnregisterFonts     2500
RemoveRegistryValues        2600
UnregisterClassInfo     2700
UnregisterExtensionInfo     2800
UnregisterProgIdInfo        2900
UnregisterMIMEInfo      3000
RemoveIniValues     3100
RemoveShortcuts     3200
RemoveEnvironmentStrings        3300
RemoveDuplicateFiles        3400
RemoveFiles     3500
RemoveFolders       3600
CreateFolders       3700
MoveFiles       3800
InstallFiles        4000
PatchFiles      4090
DuplicateFiles      4210
BindImage       4300
CreateShortcuts     4500
RegisterClassInfo       4600
RegisterExtensionInfo       4700
RegisterProgIdInfo      4800
RegisterMIMEInfo        4900
WriteRegistryValues     5000
WriteIniValues      5100
WriteEnvironmentStrings     5200
RegisterFonts       5300
InstallODBC     5400
RegisterTypeLibraries       5500
SelfRegModules      5600
RegisterComPlus     5700
InstallServices VersionNT   5800
StartServices   VersionNT   5900
RegisterUser        6000
RegisterProduct     6100
PublishComponents       6200
MsiPublishAssemblies        6250
PublishFeatures     6300
PublishProduct      6400
RegisterDLLs        6501
InstallFinalize     6600

файлы должны быть установлены в последовательности 4000, но в 6501, когда я пытаюсь зарегистрировать DLL, файлы еще не появляются на диске (используя sysinternals procmon, я вижу, что ошибка возникает из-за того, что файл не найден)

если я попытаюсь запустить после этапа финализации (6601), то установщик лишится прав администратора и не сможет зарегистрировать dll.

как я могу достичь желаемого результата?


person James Kent    schedule 12.11.2018    source источник
comment
Извините, я не понимаю, чем именно фактическое поведение с вашим установочным файлом отличается от ожидаемого поведения. Видите ли вы DLL в ожидаемом месте в каталоге установки после завершения выполнения программы установки?   -  person jpeg    schedule 12.11.2018
comment
Вы смотрели на этот вопрос: stackoverflow.com/q/8822223/8516269?   -  person jpeg    schedule 12.11.2018
comment
проблема в том, что DLL должна быть зарегистрирована с настраиваемым параметром командной строки, который используется для целей лицензирования, поэтому я не могу записать, что происходит с реестром во время установки, и сделать его частью MSI как уникальным для каждого компьютера. что касается этого вопроса, к сожалению, ошибка, которую я получаю, это ошибка 3, т.е. файл не найден при запуске команды   -  person James Kent    schedule 12.11.2018
comment
также из-за ошибки установка не завершается. если я удалю настраиваемое действие, то да, я увижу DLL в ожидаемом месте, но по какой-то причине она не существует во время запуска команды, и поскольку она должна выполняться от имени администратора, ее также нужно запускать до InstallFinalize   -  person James Kent    schedule 12.11.2018
comment
Тогда, я боюсь, я не могу помочь дальше. Похоже, что самостоятельная регистрация с помощью regsvr32 не считается лучшей практикой и лишь частично поддерживается MSI. Возможно, вам потребуется использовать более настраиваемые инструменты MSI, см., например. этот пост. Я также успешно использовал NSIS для других целей.   -  person jpeg    schedule 13.11.2018
comment
@jpegСпасибо за помощь, посмотрю NSIS.   -  person James Kent    schedule 13.11.2018