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

Popular posts from this blog

Add email recipient to all new Trac tickets -

400 Bad Request on Apache/PHP AddHandler wrapper -

php - Change action and image src url's with jQuery -