InstallShield Automation无法创建对象

时间:2015-02-19 19:21:50

标签: powershell vbscript 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上看,我看到的是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,创建对象等)。

2 个答案:

答案 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直观地浏览注册表。