// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. namespace WixToolset.Harvesters { using System; using System.Globalization; using System.Runtime.InteropServices; using Wix = WixToolset.Harvesters.Serialize; /// /// Harvest WiX authoring from a type library file. /// public sealed class TypeLibraryHarvester { /// /// Harvest the registry values written by RegisterTypeLib. /// /// The file to harvest registry values from. /// The harvested registry values. public Wix.RegistryValue[] HarvestRegistryValues(string path) { using (RegistryHarvester registryHarvester = new RegistryHarvester(true)) { NativeMethods.RegisterTypeLibrary(path); return registryHarvester.HarvestRegistry(); } } /// /// Parses a hexadecimal version string into a Version object. /// /// Hexadecimal version string, for example "1.A.3C.F241" /// Version object, or null if versionString is not a valid hex version. public static Version ParseHexVersion(string versionString) { if (String.IsNullOrEmpty(versionString)) { return null; } int[] versionNumbers = new int[4]; string[] versionNumberStrings = versionString.Split('.'); for (int i = 0; i < versionNumbers.Length && i < versionNumberStrings.Length; i++) { if (!Int32.TryParse(versionNumberStrings[i], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out versionNumbers[i])) { return null; } } return new Version(versionNumbers[0], versionNumbers[1], versionNumbers[2], versionNumbers[3]); } /// /// Native methods for registering type libraries. /// private sealed class NativeMethods { /// /// Registers a type library. /// /// The type library file to register. internal static void RegisterTypeLibrary(string typeLibraryFile) { IntPtr ptlib; LoadTypeLib(typeLibraryFile, out ptlib); RegisterTypeLib(ptlib, typeLibraryFile, null); } /// /// Loads and registers a type library. /// /// Contains the name of the file from which LoadTypeLib should attempt to load a type library. /// On return, contains a pointer to a pointer to the loaded type library. /// LoadTypeLib will not register the type library if the path of the type library is specified. [DllImport("oleaut32.dll", PreserveSig = false)] private static extern void LoadTypeLib([MarshalAs(UnmanagedType.BStr)] string szFile, out IntPtr pptlib); /// /// Adds information about a type library to the system registry. /// /// Pointer to the type library being registered. /// Fully qualified path specification for the type library being registered. /// Directory in which the Help file for the library being registered can be found. Can be Null. [DllImport("oleaut32.dll", PreserveSig = false)] private static extern void RegisterTypeLib(IntPtr ptlib, [MarshalAs(UnmanagedType.BStr)] string szFullPath, [MarshalAs(UnmanagedType.BStr)] string szHelpDir); } } }