【问题标题】:string too long with MsiGetProperty with Installshield Installscript带有 Installshield Installscript 的 MsiGetProperty 字符串太长
【发布时间】:2013-05-22 11:08:53
【问题描述】:

我正在使用 MsiGetProperty 从安装程序获取字符串参数值。 之后,我调用了一个托管 dll 并传递了该值:

  nvBufferSize = MAX_STRING;
  MsiGetProperty (hMSI, "DBHMS", sDbHost, nvBufferSize);  

当我传递 sDbHost 的值时,当我从托管代码接收到它时是这样的: srvdata-02NULNULNULNULNULNUL...... 但是在界面中我只写了“srvdata-02”。

使用相同的代码,Installshield 2010 很好,现在我将它升级到 installshield 2012。 请问您有什么解决办法吗?

【问题讨论】:

    标签: string winapi windows-installer installshield installscript


    【解决方案1】:

    不久前对 MsiGetProperty 进行了一些行为更改。尝试将 nvBufferSize 设置为 MAX_SIZE 而不是 MAX_STRING。还要检查 MsiGetProperty 的返回代码,看看它是否等于 ERROR_MORE_DATA 或者它是否返回了一些其他代码。最后检查 nvBufferSize 的值,看看需要多少字节。

    顺便说一句,如果您只是想将属性编组到托管代码,您可能需要考虑查看 Windows Installer XML (WiX) 中的部署工具框架 (DTF)。这是一个非常好的 SDK,它允许您编写托管代码自定义操作并将它们打包,就好像它们是本机 Win32 库一样。然后 InstallShield 可以轻松地将其用作 MSI DLL 自定义操作。

    DTF 提供了一个互操作库和一个会话对象,可以像这样使用:

    【讨论】:

    • MAX_SIZE 未在 InstallShield 2013 中定义。
    • 猜不出来。有趣的是,20 年后我对 InstallScript 的遗忘比我记得的还要多。
    【解决方案2】:

    尽管看起来很荒谬,但这里有一个适合您的 InstallScript 解决方案:

    nvBufferSize = MAX_STRING;
    nResult = MsiGetProperty( ISMSI_HANDLE, szPropertyName, svValue, nvBufferSize );     
    if( nResult = ERROR_MORE_DATA ) then 
        MsiGetProperty( ISMSI_HANDLE, szPropertyName, svValue, nvBufferSize );   
    endif;
    

    第一次尝试返回所需的实际缓冲区大小。如果它大于最大字符串(1024?),则第二次调用将获取全部内容。

    另外,我发现我可以立即将 nvBufferSize 分配给更大的值,例如4096 并在一次调用中使用它(假设数据不再是那个限制)。然而,双重调用更简单。

    根据:https://msdn.microsoft.com/en-us/library/aa370134(v=vs.85).aspx api 函数实际上旨在通过传递一个空的文字(“”)而不是字符串变量来返回缓冲区大小。如果您尝试这样做,InstallScript 2013 会向您抛出编译错误...

    【讨论】:

    • 更进一步,将其包装到辅助函数中。是的,这就是它的工作原理....虽然这些天我真的不能说我真的经常使用 InstallScript。通常我只是使用 DTF / C# 自定义操作,因为 .NET 2.0 或更高版本现在应该在几乎每台机器上。
    • 我同意。理想情况下,您会将其粘贴在实用程序包含脚本中的函数中。我了解您远离 InstallScript 的举动。我在 InstallShield 中使用它本质上是为了实现这一切的“连续性”。
    • IMO,这是一种体面的语言。它始于在 C++ 中做同等事情需要更多工作的时候。多年来,他们一直致力于 COM 和 .NET 互操作。然而,WiX DTF/C# 自定义操作很好地集成到了 InstallShield 中。一个完全修补的 Windows XP 机器将具有 .NET 2.0。 Vista 自带 3.0 等等。我为 CLR 2.0 编写我的 CA,并包含一个 CustomAction 配置文件,该文件说绑定到 2.0 或 4.0。现在,我能够充分利用基类库的全部功能,而 InstallScript 没有什么不能做到的。也就是说,构建自动化需要更多的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多