我正在用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所有这些操作要容易得多。