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

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


此函数返回ERROR_SUCCESS并且MSIHANDLE db不为null
然后我调用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

最佳答案

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

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

如果您愿意,通过Microsoft.Deployment.WindowsInstaller在.NET中进行FWIW所有这些操作要容易得多。

10-06 13:15