Hi Peter & James,

I really appreciate your help on this - thank you!!

I went with the interop route and attach a sample app (if anyone is
interested) in what I have done.

Best Regards,
Anil.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication2
{
    class Program
    {
        [DllImport("msi", CharSet = CharSet.Auto)]
        static extern int MsiGetProductCode(string component, StringBuilder
buffer);

        [DllImport("msi", CharSet = CharSet.Auto)]
        static extern int MsiEnumFeatures(string product, uint featureIndex,
StringBuilder featureBuffer, StringBuilder parentBuffer);

        [DllImport("msi", CharSet = CharSet.Auto)]
        static extern int MsiQueryFeatureState(string product, string
featureBuffer);

        public static string GetProductCode(string component)
        {
            StringBuilder productCodeStringBuilder = new StringBuilder(512);
            int nRes = MsiGetProductCode(component,
productCodeStringBuilder);
            return productCodeStringBuilder.ToString();

            //switch (MsiGetProductCode(component,
productCodeStringBuilder))
            //{
            //    case ERROR_SUCCESS:
            //        return productCodeStringBuilder.ToString();
            //    // *Please* don't actually just throw an exception like
this.
            //    // Throw the relevent exception based on the error code
returned.
            //    case ERROR_BAD_CONFIGURATION:
            //        throw new Exception("The configuration data is
corrupt.");
            //    case ERROR_INSTALL_FAILURE:
            //        throw new Exception("The product code could not be
determined.");
            //    case ERROR_INVALID_PARAMETER:
            //        throw new Exception("An invalid parameter was passed
to the function.");
            //    case ERROR_UNKNOWN_COMPONENT:
            //        throw new Exception("The specified component is
unknown.");
            //    default:
            //        throw new Exception();
            //}
        }
        public static void EnumFeatures(string product)
        {
            StringBuilder featureBuf = new StringBuilder(256);
            StringBuilder parentBuf = new StringBuilder(256);

            for (uint i=0; ; i++)
            {
                int nRes = MsiEnumFeatures(product, i, featureBuf,
parentBuf);
                if (nRes != 0)
                    break;

                int featureQCode = QueryFeatureState(product,
featureBuf.ToString());

                Console.WriteLine(String.Format("Feature {0} ",
featureBuf.ToString()));
            }
            return;
        }

        public static int QueryFeatureState(string product, string feature)
        {
            return MsiQueryFeatureState(product, feature);
        }

        static void Main(string[] args)
        {
            //pass in guid of product
            string s =
GetProductCode("{14CCA315-92CE-48E7-8C7C-87923F770B47}");
            EnumFeatures(s);
        }
    }
}

//useful links
http://source.winehq.org/source/include/msi.h
http://msdn.microsoft.com/en-us/library/aa369426(v=VS.85).aspx





On Thu, Aug 25, 2011 at 3:33 PM, James Johnston <johnst...@inn-soft.com>wrote:

> You could always use the COM library if you're not comfortable with the C
> API calls.  Add a COM reference to "Microsoft Windows Installer Object
> Library" to your project...
>
> Installer.get_Features and Installer.get_FeatureState look like they might
> be useful.
>
> -----Original Message-----
> From: Anil Patel [mailto:apatel...@googlemail.com]
> Sent: Thursday, August 25, 2011 11:12
> To: General discussion for Windows Installer XML toolset.
> Subject: Re: [WiX-users] Identifying Features that have been installed
>
> Hi Peter,
>
> Really appreciate your feedback on this.
>
> The MsiGetEnumsFeatues() is defined as
>
> UINT MsiEnumFeatures(
>  __in   LPCTSTR szProduct,
>  __in   DWORD iFeatureIndex,
>  __out  LPTSTR lpFeatureBuf,
>  __out  LPTSTR lpParentBuf
> );
>
> So to get the product code, I found this code
>
>        [DllImport("msi", CharSet = CharSet.Auto)]
>        static extern int MsiGetProductCode(string component, StringBuilder
> buffer);
>
>        public static string GetProductCode(string component)
>        {
>            StringBuilder productCodeStringBuilder = new StringBuilder(512);
>            switch (MsiGetProductCode(component, productCodeStringBuilder))
>            {
>                case ERROR_SUCCESS:
>                    return productCodeStringBuilder.ToString();
>                // *Please* don't actually just throw an exception like
> this.
>                // Throw the relevent exception based on the error code
> returned.
>                case ERROR_BAD_CONFIGURATION:
>                    throw new Exception("The configuration data is
> corrupt.");
>                case ERROR_INSTALL_FAILURE:
>                    throw new Exception("The product code could not be
> determined.");
>                case ERROR_INVALID_PARAMETER:
>                    throw new Exception("An invalid parameter was passed to
> the function.");
>                case ERROR_UNKNOWN_COMPONENT:
>                    throw new Exception("The specified component is
> unknown.");
>                default:
>                    throw new Exception();
>            }
>        }
>
> The problem is thay symbolic constants in the switch statement (eg
> ERROR_INVALID_PARAMETER which are uints) aren't recognised so error on
> compile.
>
> Do you know how I can resolve these. I'm assuming there might be an Enum
> for
> them but I can't locate them.
>
> Again any help would be appreciated.
>
> Regards,
> Anil.
>
>
> On Thu, Aug 25, 2011 at 11:13 AM, Peter Shirtcliffe
> <pshirtcli...@sdl.com>wrote:
>
> > MsiEnumFeatures()
> > http://msdn.microsoft.com/en-us/library/aa370098%28v=vs.85%29.aspx
> >
> >
> > -----Original Message-----
> > From: Anil Patel [mailto:apatel...@googlemail.com]
> > Sent: 25 August 2011 11:08
> > To: General discussion for Windows Installer XML toolset.
> > Subject: [WiX-users] Identifying Features that have been installed
> >
> > Hello,
> >
> > I have a configuration program that is run manually by a user
> > (following a new install or a change to an existing installation)
> > which allows the user to configure the installed features.
> >
> > There is a requirement to disable the configuration of features not
> > installed by the user.
> >
> > The question is, is there a way for the configuration program to
> > identify which featues have been installed?
> >
> > I could record this data into the registry during the install and
> > remove it when a feature is uninstalled but I just wondered if there
> > was any other way of doing this.
> >
> > Thank you for your time.
> >
> >
> > Regards,
> > Anil.
> >
> > ----------------------------------------------------------------------
> > -------
> > -
> > EMC VNX: the world's simplest storage, starting under $10K The only
> > unified storage solution that offers unified management Up to 160%
> > more powerful than alternatives and 25% more efficient.
> > Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
> > _______________________________________________
> > WiX-users mailing list
> > WiX-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/wix-users
> > SDL PLC confidential, all rights reserved.
> > If you are not the intended recipient of this mail SDL requests and
> > requires that you delete it without acting upon or copying any of its
> > contents, and we further request that you advise us.
> > SDL PLC is a public limited company registered in England and Wales.
> >  Registered number: 02675207.
> > Registered address: Globe House, Clivemont Road, Maidenhead, Berkshire
> > SL6 7DY, UK.
> >
> >
> >
> > ----------------------------------------------------------------------
> > -------- EMC VNX: the world's simplest storage, starting under $10K
> > The only unified storage solution that offers unified management Up to
> > 160% more powerful than alternatives and 25% more efficient.
> > Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
> > _______________________________________________
> > WiX-users mailing list
> > WiX-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/wix-users
> >
>
> ----------------------------------------------------------------------------
> --
> EMC VNX: the world's simplest storage, starting under $10K The only unified
> storage solution that offers unified management Up to 160% more powerful
> than alternatives and 25% more efficient.
> Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
> _______________________________________________
> WiX-users mailing list
> WiX-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wix-users
>
>
>
> ------------------------------------------------------------------------------
> EMC VNX: the world's simplest storage, starting under $10K
> The only unified storage solution that offers unified management
> Up to 160% more powerful than alternatives and 25% more efficient.
> Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
> _______________________________________________
> WiX-users mailing list
> WiX-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wix-users
>
------------------------------------------------------------------------------
EMC VNX: the world's simplest storage, starting under $10K
The only unified storage solution that offers unified management 
Up to 160% more powerful than alternatives and 25% more efficient. 
Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
_______________________________________________
WiX-users mailing list
WiX-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wix-users

Reply via email to