【问题标题】:Function MsiGetProperty() fails函数 MsiGetProperty() 失败
【发布时间】:2014-11-19 22:49:10
【问题描述】:

我正在用 C++ 编写一个工具来获取给定 MSI 文件的版本。 我正在使用 MsiOpenDatabase() 来获取句柄

MsiOpenDatabase(msifile.c_str(), MSIDBOPEN_READONLY, &db);

此函数返回 ERROR_SUCCESS 并且 MSIHANDLE db 不为空 然后我调用 MsiGetProperty()

MsiGetProperty(db, L"ProductVersion", buffer, &buffsize);

这个函数返回ERROR_INVALID_HANDLE。 我做错了什么?

http://msdn.microsoft.com/en-us/library/aa370338%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/aa370134%28v=vs.85%29.aspx

【问题讨论】:

    标签: c++ windows api installation windows-installer


    【解决方案1】:

    如果您查看 MsiGetProperty 的文档,它会说:

    hInstall [in]

    提供给自定义 DLL 的安装句柄 操作或通过 MsiOpenPackageMsiOpenPackageExMsiOpenProduct

    您的句柄不是来自这三个函数之一 - 它来自MsiOpenDatabase。因此,即使您的句柄有效,它对于 MsiGetProperty 调用也无效。

    【讨论】:

      【解决方案2】:

      MsiOpenDatabase 返回数据库句柄而不是安装程序句柄。 MsiGetProperty 需要安装程序句柄,因为您正在获取正在运行的安装程序的属性。

      您需要使用 API 对 Property 表执行 SQL 查询,以打开视图、执行视图、获取记录并获取列数据。请务必检查所有返回码,正确分配内存并在完成后关闭句柄。

      如果您愿意的话,通过 Microsoft.Deployment.WindowsInstaller 在 .NET 中,所有这一切都会变得容易得多。

      【讨论】:

        【解决方案3】:

        感谢您指出数据库句柄和安装程序句柄之间的区别。 事实证明,我找到了一些 VBS 示例 (http://msdn.microsoft.com/en-us/library/aa372865%28v=vs.85%29.aspx),它们指导我如何使用 Windows Installer API。我使用 WiRunSQL.vbs 作为指南。

        最后,工作流程大致是这样的:

        MsiOpenDatabase(file.c_str(), MSIDBOPEN_READONLY, &db);
        MsiDatabaseOpenView(db, query.c_str(), &view);
        MsiViewExecute(view, 0);
        MsiViewFetch(view, &record);
        MsiRecordGetString(record, i, buffer, &buffsize); //(repeat as many times as necessary, incrementing i)
        

        当然,正如 Christopher 所说,有很多错误检查、内存分配和 处理关闭过程中。但总体思路是这样的。

        您必须调用 MsiRecordGetString() 的次数取决于您的查询。 我用过这个

        SELECT Value From Property WHERE Property='ProductVersion'
        

        使用此查询,我必须调用一次 MsiRecordGetString(),其中 i = 1

        【讨论】:

        • 是的,有一个 Win32 API 和一个 COM 自动化接口。 .NET 类封装了 Win32 API 函数并提供更高级别的抽象,例如使用强类型类的 LINQ 查询来表示各种内置表。
        猜你喜欢
        • 1970-01-01
        • 2021-11-29
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        • 2016-07-13
        相关资源
        最近更新 更多