【问题标题】:InstallShield Automation can't create objectInstallShield Automation 无法创建对象
【发布时间】:2015-04-21 07:26:33
【问题描述】:

我正在使用 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'

谷歌再次出现,我检查了: 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 组件实例失败: 来自 HRESULT 的 800a801d 异常:0x800A801D。

如果我只运行 vbs 而没有 cmd 提示,我还会在弹出框中看到 800A801D 的错误。

我该如何解决这个问题?我想使用 powershell,但此时 vbs 修复也会有所帮助。我已经尝试了我能想到的一切,谷歌说我做得对(32 位 powershell/cmd、注册 dll、创建对象等)。

【问题讨论】:

    标签: powershell vbscript installshield


    【解决方案1】:

    您是否安装了自动化接口?通常,它是一个可选功能,在您安装 InstallShield 时设置为不存在。

    【讨论】:

    • 这就是原因。当我的经理安装它时,他没有安装界面(只有主文件)。这导致主 dll 存在并被注册,但没有别的。因此,当我检查时,它声称一切都很好,但实际上并非如此。修复安装和安装界面解决了这个问题。谢谢您的帮助。 :)
    【解决方案2】:

    通常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 直观地查看注册表。

    【讨论】:

    • 他可能忘记安装了?
    • 我做了这些,得到了和你一样的东西。唯一的区别是:InprocServer32 REG_MULTI_SZ ZV!7Pm6!PA9}[t,5xy9OCoreFiles>Q=6`dAqEj9~,^,)m=-R+ ThreadingModel REG_SZ Apartment
    • @JeremyStyers:嗯。这种差异可能是因为我在我的开发环境而不是在正确安装的机器上进行了测试; darwin 描述符仅通过 MSI 安装显示。因此,这有效地证明了它已安装;我认为修复没有帮助?
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 2013-10-22
    • 2017-10-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多