c# - Checking ProductVersion of an MSI programatically -
i had searched high , low yesterday looking how obtain productversion of msi databse. found involved utilizing windowsinstaller com wrapper, while got job done, want achieve same results through pinvoke using msi.dll.
here's i've come with.
c# windows installer com library:
// type of windows installer object type installertype = type.gettypefromprogid("windowsinstaller.installer"); // create windows installer object installer installer = (installer)activator.createinstance(installertype); // open msi database in input file database database = installer.opendatabase(od.filename, msiopendatabasemode.msiopendatabasemodereadonly); // open view on property table version property windowsinstaller.view view = database.openview("select * property property = 'productversion'"); // execute view query view.execute(null); // record view record record = view.fetch(); // version data string version = record.get_stringdata(2); c# pinvoke:
[dllimport("msi.dll", setlasterror = true)] static extern uint msiopendatabase(string szdatabasepath, intptr phpersist, out intptr phdatabase); [dllimport("msi.dll", charset = charset.unicode)] static extern int msidatabaseopenvieww(intptr hdatabase, [marshalas(unmanagedtype.lpwstr)] string szquery, out intptr phview); [dllimport("msi.dll", charset = charset.unicode)] static extern int msiviewexecute(intptr hview, intptr hrecord); [dllimport("msi.dll", charset = charset.unicode)] static extern uint msiviewfetch(intptr hview, out intptr hrecord); [dllimport("msi.dll", charset = charset.unicode)] static extern int msirecordgetstring(intptr hrecord, int ifield, [out] stringbuilder szvaluebuf, ref int pcchvaluebuf); [dllimport("msi.dll", exactspelling = true)] static extern intptr msicreaterecord(uint cparams); [dllimport("msi.dll", exactspelling = true)] static extern uint msiclosehandle(intptr hany); public string getversioninfo(string filename) { string sqlstatement = "select * property property = 'productversion'"; intptr phdatabase = intptr.zero; intptr phview = intptr.zero; intptr hrecord = intptr.zero; stringbuilder szvaluebuf = new stringbuilder(); int pcchvaluebuf = 255; // open msi database in input file uint val = msiopendatabase(filename, intptr.zero, out phdatabase); hrecord = msicreaterecord(1); // open view on property table version property int viewval = msidatabaseopenvieww(phdatabase, sqlstatement, out phview); // execute view query int exeval = msiviewexecute(phview, hrecord); // record view uint fetchval = msiviewfetch(phview, out hrecord); // version data int retval = msirecordgetstring(hrecord, 2, szvaluebuf, ref pcchvaluebuf); uretcode = msiclosehandle(phdatabase); uretcode = msiclosehandle(phview); uretcode = msiclosehandle(hrecord); return szvaluebuf.tostring(); } this extrapolated obtaining property or field msi database changing sql statement. hope helps out.
Comments
Post a Comment