InstallShield Automation 无法创建对象
InstallShield Automation can't create object
我正在使用 Installshield 2014 和 2011。我正在使用主要升级和自动构建脚本来处理构建。 InstallShield 是独立构建版本。对于两者。
现在在 windows 2003 服务器上使用 Installshield 2011 一切正常。我可以使用自动化界面打开一个项目,更改产品代码(用于主要升级)然后在构建安装程序之前保存它。
此类代码位于 vbs 文件中:
Dim oISM, oGUID
Set oGUID = CreateObject("InstallShield.GUID")
Set oISM = CreateObject("IswiAuto17.ISWiProject")
oISM.OpenProject strInstallShieldProjectFile
oISM.ProductCode = "{" & oGUID.CreateGUID( ) & "}"
oISM.SaveProject : oISM.CloseProject : set oISM = Nothing
现在我们已经升级到 windows 2012 服务器和 InstallShield 2014。我仔细检查过,根据 InstallShield,唯一需要更改的是版本号(17 更改为 21)。
但现在没有任何效果。如果我取出代码并将其放入它自己的 vbs 文件中进行测试并 运行 它,我得到这个:
ActiveX 组件无法创建对象:'InstallShield.GUID'
查看 google 我看到那是来自 运行ning 的 64 位模式....但我不是。我正在 运行 在 32 位模式下使用 cmd 提示符。
http://helpnet.flexerasoftware.com/installshield18helplib/AutomationInterface64Bit.htm
我尝试调用脚本:
%WINDIR%\SYSWOW64\cmd.exe /c cscript
按照此处的建议:
How do I run a VBScript in 32-bit mode on a 64-bit machine?
等地。这没有用,因为我遇到了同样的错误。
我尝试删除该行,因为我确信我可以用另一种方式创建 guid,然后重新运行它。
然后我在尝试创建项目时得到了这个:
未知 运行时间错误:'CreateObject'
再次出现 google 我检查了:
https://community.flexerasoftware.com/showthread.php?189788-Automation-error
和其他人。我试着确保 dll 是使用 regsvr32 注册的,它说它是成功的。但是re运行ning之后,还是报同样的错误。
我尝试直接复制 InstallShield 文档中的命令以确保没有拼写错误,但同样的错误。
我什至尝试切换 "sw" 的大小写,如下所述:
Installshield Automation is failing while running vbscript with error unable to create object
同样的错误。
我也尝试切换到 powershell,因为 powershell 更容易调试和阅读。
powershell代码很简单,如下:
$oIsm = new-object -comobject IswiAuto21.ISWiProject
$oISM.OpenProject("$file")
$oISM.ProductCode = "{" + [guid]::NewGuid() + "}"
$oISM.SaveProject(); $oISM.CloseProject(); $oISM = $null
但这也不起作用,尽管这些说它应该:
https://community.flexerasoftware.com/showthread.php?190769-Automation-using-Powershell
http://blogs.flexerasoftware.com/installtalk/2011/01/getting-started-with-installshield-automation-and-powershell.html
当我使用 32 位 powershell 时出现此错误:
new-object:由于以下错误,从 IClassFactory 创建 CLSID 为 {78D393F9-76E3-438C-9CAB-6664EF5FE1F2} 的 COM 组件实例失败:
800a801d 来自 HRESULT 的异常:0x800A801D。
如果我运行只有vbs没有cmd提示,我也会在弹出框中看到错误800A801D。
我该如何解决这个问题?我想使用 powershell,但此时 vbs 修复也会有所帮助。我已经尝试了所有我能想到的方法,google 说我做对了(32 位 powershell/cmd、注册 dll、创建对象等)。
通常,HRESULT
应该会告诉您出了什么问题,或者过于笼统以至于无济于事。在这种情况下,它有点像个谜,因为我在任何地方都找不到它的定义。前面的0x800A...
表示FACILITY_CONTROL
,后面的...801d
恰好和TYPE_E_LIBNOTREGISTERED (0x8002801D)
的尾巴相匹配,不知道有没有意义。不幸的是 FACILITY_CONTROL
是由发出错误的控件定义的,这里不清楚。
让我们试着找出问题所在。我打赌 COM 注册。如果需要,您可以跳到 运行 regsvr32 C:\...\System\ISWiAutomation21.dll
.
可能的修复
那么让我们看看 CreateObject("IswiAuto21.ISWiProject")
会做什么。首先它必须查找 ProgID:
C:\>reg query HKCR\ISWiAuto21.ISWiProject\Clsid
HKEY_CLASSES_ROOT\ISWiAuto21.ISWiProject\Clsid
(Default) REG_SZ {78D393F9-76E3-438C-9CAB-6664EF5FE1F2}
然后它必须查找 CLSID,在这种情况下,它的 InprocServer32 键:
C:\>reg query HKCR\Clsid\{78D393F9-76E3-438C-9CAB-6664EF5FE1F2}\InprocServer32
HKEY_CLASSES_ROOT\Clsid\{78D393F9-76E3-438C-9CAB-6664EF5FE1F2}\InprocServer32
(Default) REG_SZ C:\...\ISWiAutomation21.dll
ThreadingModel REG_SZ Apartment
如果缺少其中任何一个,将无法找到 COM 服务器。此外,TypeLib
子项及其引用的类型库都很重要:
C:\>reg query HKCR\Clsid\{78D393F9-76E3-438C-9CAB-6664EF5FE1F2}\Typelib
HKEY_CLASSES_ROOT\Clsid\{78D393F9-76E3-438C-9CAB-6664EF5FE1F2}\Typelib
(Default) REG_SZ {92278CC1-987E-4A01-940C-47DCADF27496}
C:\>reg query HKCR\Typelib\{92278CC1-987E-4A01-940C-47DCADF27496}.1[=12=]\win32
HKEY_CLASSES_ROOT\Typelib\{92278CC1-987E-4A01-940C-47DCADF27496}.1[=12=]\win32
(Default) REG_SZ C:\...\ISWiAutomation21.dll
如果缺少任何此信息,则必须进行修复。此时 COM 服务器本身可能需要探测几个额外的 ID,因此即使这个子集没问题,也有可能还有其他的 ID 丢失或损坏。 Self-registering COM 服务器应该解决这个问题。 运行 安装的修复也应该如此。
请注意,所有这些查询都是使用 32 位命令 C:\Windows\SysWow64\reg.exe
完成的,或者您可以使用 C:\Windows\SysWow64\regedit.exe
.
直观地细读注册表
你安装了自动化界面吗?通常它是一个可选功能,在您安装 InstallShield 时设置为不存在。
我正在使用 Installshield 2014 和 2011。我正在使用主要升级和自动构建脚本来处理构建。 InstallShield 是独立构建版本。对于两者。
现在在 windows 2003 服务器上使用 Installshield 2011 一切正常。我可以使用自动化界面打开一个项目,更改产品代码(用于主要升级)然后在构建安装程序之前保存它。
此类代码位于 vbs 文件中:
Dim oISM, oGUID
Set oGUID = CreateObject("InstallShield.GUID")
Set oISM = CreateObject("IswiAuto17.ISWiProject")
oISM.OpenProject strInstallShieldProjectFile
oISM.ProductCode = "{" & oGUID.CreateGUID( ) & "}"
oISM.SaveProject : oISM.CloseProject : set oISM = Nothing
现在我们已经升级到 windows 2012 服务器和 InstallShield 2014。我仔细检查过,根据 InstallShield,唯一需要更改的是版本号(17 更改为 21)。
但现在没有任何效果。如果我取出代码并将其放入它自己的 vbs 文件中进行测试并 运行 它,我得到这个:
ActiveX 组件无法创建对象:'InstallShield.GUID'
查看 google 我看到那是来自 运行ning 的 64 位模式....但我不是。我正在 运行 在 32 位模式下使用 cmd 提示符。 http://helpnet.flexerasoftware.com/installshield18helplib/AutomationInterface64Bit.htm
我尝试调用脚本: %WINDIR%\SYSWOW64\cmd.exe /c cscript
按照此处的建议: How do I run a VBScript in 32-bit mode on a 64-bit machine?
等地。这没有用,因为我遇到了同样的错误。
我尝试删除该行,因为我确信我可以用另一种方式创建 guid,然后重新运行它。
然后我在尝试创建项目时得到了这个: 未知 运行时间错误:'CreateObject'
再次出现 google 我检查了: https://community.flexerasoftware.com/showthread.php?189788-Automation-error
和其他人。我试着确保 dll 是使用 regsvr32 注册的,它说它是成功的。但是re运行ning之后,还是报同样的错误。
我尝试直接复制 InstallShield 文档中的命令以确保没有拼写错误,但同样的错误。
我什至尝试切换 "sw" 的大小写,如下所述: Installshield Automation is failing while running vbscript with error unable to create object
同样的错误。
我也尝试切换到 powershell,因为 powershell 更容易调试和阅读。
powershell代码很简单,如下:
$oIsm = new-object -comobject IswiAuto21.ISWiProject
$oISM.OpenProject("$file")
$oISM.ProductCode = "{" + [guid]::NewGuid() + "}"
$oISM.SaveProject(); $oISM.CloseProject(); $oISM = $null
但这也不起作用,尽管这些说它应该: https://community.flexerasoftware.com/showthread.php?190769-Automation-using-Powershell http://blogs.flexerasoftware.com/installtalk/2011/01/getting-started-with-installshield-automation-and-powershell.html
当我使用 32 位 powershell 时出现此错误:
new-object:由于以下错误,从 IClassFactory 创建 CLSID 为 {78D393F9-76E3-438C-9CAB-6664EF5FE1F2} 的 COM 组件实例失败: 800a801d 来自 HRESULT 的异常:0x800A801D。
如果我运行只有vbs没有cmd提示,我也会在弹出框中看到错误800A801D。
我该如何解决这个问题?我想使用 powershell,但此时 vbs 修复也会有所帮助。我已经尝试了所有我能想到的方法,google 说我做对了(32 位 powershell/cmd、注册 dll、创建对象等)。
通常,HRESULT
应该会告诉您出了什么问题,或者过于笼统以至于无济于事。在这种情况下,它有点像个谜,因为我在任何地方都找不到它的定义。前面的0x800A...
表示FACILITY_CONTROL
,后面的...801d
恰好和TYPE_E_LIBNOTREGISTERED (0x8002801D)
的尾巴相匹配,不知道有没有意义。不幸的是 FACILITY_CONTROL
是由发出错误的控件定义的,这里不清楚。
让我们试着找出问题所在。我打赌 COM 注册。如果需要,您可以跳到 运行 regsvr32 C:\...\System\ISWiAutomation21.dll
.
那么让我们看看 CreateObject("IswiAuto21.ISWiProject")
会做什么。首先它必须查找 ProgID:
C:\>reg query HKCR\ISWiAuto21.ISWiProject\Clsid
HKEY_CLASSES_ROOT\ISWiAuto21.ISWiProject\Clsid
(Default) REG_SZ {78D393F9-76E3-438C-9CAB-6664EF5FE1F2}
然后它必须查找 CLSID,在这种情况下,它的 InprocServer32 键:
C:\>reg query HKCR\Clsid\{78D393F9-76E3-438C-9CAB-6664EF5FE1F2}\InprocServer32
HKEY_CLASSES_ROOT\Clsid\{78D393F9-76E3-438C-9CAB-6664EF5FE1F2}\InprocServer32
(Default) REG_SZ C:\...\ISWiAutomation21.dll
ThreadingModel REG_SZ Apartment
如果缺少其中任何一个,将无法找到 COM 服务器。此外,TypeLib
子项及其引用的类型库都很重要:
C:\>reg query HKCR\Clsid\{78D393F9-76E3-438C-9CAB-6664EF5FE1F2}\Typelib
HKEY_CLASSES_ROOT\Clsid\{78D393F9-76E3-438C-9CAB-6664EF5FE1F2}\Typelib
(Default) REG_SZ {92278CC1-987E-4A01-940C-47DCADF27496}
C:\>reg query HKCR\Typelib\{92278CC1-987E-4A01-940C-47DCADF27496}.1[=12=]\win32
HKEY_CLASSES_ROOT\Typelib\{92278CC1-987E-4A01-940C-47DCADF27496}.1[=12=]\win32
(Default) REG_SZ C:\...\ISWiAutomation21.dll
如果缺少任何此信息,则必须进行修复。此时 COM 服务器本身可能需要探测几个额外的 ID,因此即使这个子集没问题,也有可能还有其他的 ID 丢失或损坏。 Self-registering COM 服务器应该解决这个问题。 运行 安装的修复也应该如此。
请注意,所有这些查询都是使用 32 位命令 C:\Windows\SysWow64\reg.exe
完成的,或者您可以使用 C:\Windows\SysWow64\regedit.exe
.
你安装了自动化界面吗?通常它是一个可选功能,在您安装 InstallShield 时设置为不存在。