我正在使用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上看,我看到的是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
和其他人一起。我尝试确保使用regsvr32注册了dll并且它说它成功了。但是在重新运行之后,它给出了同样的错误。
我尝试直接处理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。
如果我在没有cmd提示的情况下单独运行vbs,我也会在弹出框中看到800A801D的错误。
我该如何解决这个问题?我想使用powershell但是vbs修复程序在这一点上也会有所帮助。我已经尝试了我能想到的一切,google说我正确地做了(32位powershell / cmd,注册dll,创建对象等)。
答案 0 :(得分:4)
您是否安装了自动化界面?通常,它是一个可选功能,在安装InstallShield时设置为不存在。
答案 1 :(得分:1)
通常情况下,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.1\0\win32
HKEY_CLASSES_ROOT\Typelib\{92278CC1-987E-4A01-940C-47DCADF27496}\1.1\0\win32
(Default) REG_SZ C:\...\ISWiAutomation21.dll
如果缺少任何此类信息,则必须进行修复。 COM服务器本身可能需要在此时探测其他几个ID,因此即使该子集正常,也有可能存在其他缺失或损坏的ID。自行注册COM服务器应该解决这个问题。应该运行安装修复。
请注意,所有这些查询都是使用32位命令C:\Windows\SysWow64\reg.exe
完成的,或者您可以使用C:\Windows\SysWow64\regedit.exe
直观地浏览注册表。