У меня есть пакет, который я пытаюсь обернуть в 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,},
)
чтение моей таблицы installseqeuence:
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.
как мне достичь желаемого результата?