Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:44:45

0001 // <copyright file="Program.cpp" company="Microsoft Corporation">
0002 // Copyright (C) Microsoft Corporation. All rights reserved.
0003 // Licensed under the MIT license.
0004 // </copyright>
0005 // <license>
0006 // The MIT License (MIT)
0007 //
0008 // Copyright (C) Microsoft Corporation. All rights reserved.
0009 //
0010 // Permission is hereby granted, free of charge, to any person obtaining
0011 // a copy of this software and associated documentation files (the "Software"),
0012 // to deal in the Software without restriction, including without limitation the
0013 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
0014 // sell copies of the Software, and to permit persons to whom the Software is
0015 // furnished to do so, subject to the following conditions:
0016 //
0017 // The above copyright notice and this permission notice shall be included in
0018 // all copies or substantial portions of the Software.
0019 //
0020 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0021 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0022 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0023 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0024 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0025 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0026 // SOFTWARE.
0027 // </license>
0028 
0029 #pragma once
0030 
0031 #ifdef __clang__
0032 #pragma clang diagnostic push
0033 #pragma clang diagnostic ignored "-Wnon-virtual-dtor"
0034 #endif
0035 
0036 // Constants
0037 //
0038 #ifndef E_NOTFOUND
0039 #define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND)
0040 #endif
0041 
0042 #ifndef E_FILENOTFOUND
0043 #define E_FILENOTFOUND HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)
0044 #endif
0045 
0046 // Enumerations
0047 //
0048 /// <summary>
0049 /// The state of an instance.
0050 /// </summary>
0051 enum InstanceState : unsigned {
0052   /// <summary>
0053   /// The instance state has not been determined.
0054   /// </summary>
0055   eNone = 0,
0056 
0057   /// <summary>
0058   /// The instance installation path exists.
0059   /// </summary>
0060   eLocal = 1,
0061 
0062   /// <summary>
0063   /// A product is registered to the instance.
0064   /// </summary>
0065   eRegistered = 2,
0066 
0067   /// <summary>
0068   /// No reboot is required for the instance.
0069   /// </summary>
0070   eNoRebootRequired = 4,
0071 
0072   /// <summary>
0073   /// The instance represents a complete install.
0074   /// </summary>
0075   eComplete = MAXUINT,
0076 };
0077 
0078 // Forward interface declarations
0079 //
0080 #ifndef __ISetupInstance_FWD_DEFINED__
0081 #define __ISetupInstance_FWD_DEFINED__
0082 typedef struct ISetupInstance ISetupInstance;
0083 #endif
0084 
0085 #ifndef __ISetupInstance2_FWD_DEFINED__
0086 #define __ISetupInstance2_FWD_DEFINED__
0087 typedef struct ISetupInstance2 ISetupInstance2;
0088 #endif
0089 
0090 #ifndef __IEnumSetupInstances_FWD_DEFINED__
0091 #define __IEnumSetupInstances_FWD_DEFINED__
0092 typedef struct IEnumSetupInstances IEnumSetupInstances;
0093 #endif
0094 
0095 #ifndef __ISetupConfiguration_FWD_DEFINED__
0096 #define __ISetupConfiguration_FWD_DEFINED__
0097 typedef struct ISetupConfiguration ISetupConfiguration;
0098 #endif
0099 
0100 #ifndef __ISetupConfiguration2_FWD_DEFINED__
0101 #define __ISetupConfiguration2_FWD_DEFINED__
0102 typedef struct ISetupConfiguration2 ISetupConfiguration2;
0103 #endif
0104 
0105 #ifndef __ISetupPackageReference_FWD_DEFINED__
0106 #define __ISetupPackageReference_FWD_DEFINED__
0107 typedef struct ISetupPackageReference ISetupPackageReference;
0108 #endif
0109 
0110 #ifndef __ISetupHelper_FWD_DEFINED__
0111 #define __ISetupHelper_FWD_DEFINED__
0112 typedef struct ISetupHelper ISetupHelper;
0113 #endif
0114 
0115 // Forward class declarations
0116 //
0117 #ifndef __SetupConfiguration_FWD_DEFINED__
0118 #define __SetupConfiguration_FWD_DEFINED__
0119 
0120 #ifdef __cplusplus
0121 typedef class SetupConfiguration SetupConfiguration;
0122 #endif
0123 
0124 #endif
0125 
0126 #ifdef __cplusplus
0127 extern "C" {
0128 #endif
0129 
0130 // Interface definitions
0131 //
0132 EXTERN_C const IID IID_ISetupInstance;
0133 
0134 #if defined(__cplusplus) && !defined(CINTERFACE)
0135 /// <summary>
0136 /// Information about an instance of a product.
0137 /// </summary>
0138 struct DECLSPEC_UUID("B41463C3-8866-43B5-BC33-2B0676F7F42E")
0139     DECLSPEC_NOVTABLE ISetupInstance : public IUnknown {
0140   /// <summary>
0141   /// Gets the instance identifier (should match the name of the parent instance
0142   /// directory).
0143   /// </summary>
0144   /// <param name="pbstrInstanceId">The instance identifier.</param>
0145   /// <returns>Standard HRESULT indicating success or failure, including
0146   /// E_FILENOTFOUND if the instance state does not exist.</returns>
0147   STDMETHOD(GetInstanceId)(_Out_ BSTR *pbstrInstanceId) = 0;
0148 
0149   /// <summary>
0150   /// Gets the local date and time when the installation was originally
0151   /// installed.
0152   /// </summary>
0153   /// <param name="pInstallDate">The local date and time when the installation
0154   /// was originally installed.</param>
0155   /// <returns>Standard HRESULT indicating success or failure, including
0156   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0157   /// property is not defined.</returns>
0158   STDMETHOD(GetInstallDate)(_Out_ LPFILETIME pInstallDate) = 0;
0159 
0160   /// <summary>
0161   /// Gets the unique name of the installation, often indicating the branch and
0162   /// other information used for telemetry.
0163   /// </summary>
0164   /// <param name="pbstrInstallationName">The unique name of the installation,
0165   /// often indicating the branch and other information used for
0166   /// telemetry.</param>
0167   /// <returns>Standard HRESULT indicating success or failure, including
0168   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0169   /// property is not defined.</returns>
0170   STDMETHOD(GetInstallationName)(_Out_ BSTR *pbstrInstallationName) = 0;
0171 
0172   /// <summary>
0173   /// Gets the path to the installation root of the product.
0174   /// </summary>
0175   /// <param name="pbstrInstallationPath">The path to the installation root of
0176   /// the product.</param>
0177   /// <returns>Standard HRESULT indicating success or failure, including
0178   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0179   /// property is not defined.</returns>
0180   STDMETHOD(GetInstallationPath)(_Out_ BSTR *pbstrInstallationPath) = 0;
0181 
0182   /// <summary>
0183   /// Gets the version of the product installed in this instance.
0184   /// </summary>
0185   /// <param name="pbstrInstallationVersion">The version of the product
0186   /// installed in this instance.</param>
0187   /// <returns>Standard HRESULT indicating success or failure, including
0188   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0189   /// property is not defined.</returns>
0190   STDMETHOD(GetInstallationVersion)(_Out_ BSTR *pbstrInstallationVersion) = 0;
0191 
0192   /// <summary>
0193   /// Gets the display name (title) of the product installed in this instance.
0194   /// </summary>
0195   /// <param name="lcid">The LCID for the display name.</param>
0196   /// <param name="pbstrDisplayName">The display name (title) of the product
0197   /// installed in this instance.</param>
0198   /// <returns>Standard HRESULT indicating success or failure, including
0199   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0200   /// property is not defined.</returns>
0201   STDMETHOD(GetDisplayName)(_In_ LCID lcid, _Out_ BSTR *pbstrDisplayName) = 0;
0202 
0203   /// <summary>
0204   /// Gets the description of the product installed in this instance.
0205   /// </summary>
0206   /// <param name="lcid">The LCID for the description.</param>
0207   /// <param name="pbstrDescription">The description of the product installed in
0208   /// this instance.</param>
0209   /// <returns>Standard HRESULT indicating success or failure, including
0210   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0211   /// property is not defined.</returns>
0212   STDMETHOD(GetDescription)(_In_ LCID lcid, _Out_ BSTR *pbstrDescription) = 0;
0213 
0214   /// <summary>
0215   /// Resolves the optional relative path to the root path of the instance.
0216   /// </summary>
0217   /// <param name="pwszRelativePath">A relative path within the instance to
0218   /// resolve, or NULL to get the root path.</param>
0219   /// <param name="pbstrAbsolutePath">The full path to the optional relative
0220   /// path within the instance. If the relative path is NULL, the root path will
0221   /// always terminate in a backslash.</param>
0222   /// <returns>Standard HRESULT indicating success or failure, including
0223   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0224   /// property is not defined.</returns>
0225   STDMETHOD(ResolvePath)
0226   (_In_opt_z_ LPCOLESTR pwszRelativePath, _Out_ BSTR *pbstrAbsolutePath) = 0;
0227 };
0228 #endif
0229 
0230 EXTERN_C const IID IID_ISetupInstance2;
0231 
0232 #if defined(__cplusplus) && !defined(CINTERFACE)
0233 /// <summary>
0234 /// Information about an instance of a product.
0235 /// </summary>
0236 struct DECLSPEC_UUID("89143C9A-05AF-49B0-B717-72E218A2185C")
0237     DECLSPEC_NOVTABLE ISetupInstance2 : public ISetupInstance {
0238   /// <summary>
0239   /// Gets the state of the instance.
0240   /// </summary>
0241   /// <param name="pState">The state of the instance.</param>
0242   /// <returns>Standard HRESULT indicating success or failure, including
0243   /// E_FILENOTFOUND if the instance state does not exist.</returns>
0244   STDMETHOD(GetState)(_Out_ InstanceState *pState) = 0;
0245 
0246   /// <summary>
0247   /// Gets an array of package references registered to the instance.
0248   /// </summary>
0249   /// <param name="ppsaPackages">Pointer to an array of <see
0250   /// cref="ISetupPackageReference"/>.</param>
0251   /// <returns>Standard HRESULT indicating success or failure, including
0252   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0253   /// packages property is not defined.</returns>
0254   STDMETHOD(GetPackages)(_Out_ LPSAFEARRAY *ppsaPackages) = 0;
0255 
0256   /// <summary>
0257   /// Gets a pointer to the <see cref="ISetupPackageReference"/> that represents
0258   /// the registered product.
0259   /// </summary>
0260   /// <param name="ppPackage">Pointer to an instance of <see
0261   /// cref="ISetupPackageReference"/>. This may be NULL if <see
0262   /// cref="GetState"/> does not return <see cref="eComplete"/>.</param>
0263   /// <returns>Standard HRESULT indicating success or failure, including
0264   /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
0265   /// packages property is not defined.</returns>
0266   STDMETHOD(GetProduct)
0267   (_Outptr_result_maybenull_ ISetupPackageReference **ppPackage) = 0;
0268 
0269   /// <summary>
0270   /// Gets the relative path to the product application, if available.
0271   /// </summary>
0272   /// <param name="pbstrProductPath">The relative path to the product
0273   /// application, if available.</param>
0274   /// <returns>Standard HRESULT indicating success or failure, including
0275   /// E_FILENOTFOUND if the instance state does not exist.</returns>
0276   STDMETHOD(GetProductPath)
0277   (_Outptr_result_maybenull_ BSTR *pbstrProductPath) = 0;
0278 };
0279 #endif
0280 
0281 EXTERN_C const IID IID_IEnumSetupInstances;
0282 
0283 #if defined(__cplusplus) && !defined(CINTERFACE)
0284 /// <summary>
0285 /// A enumerator of installed <see cref="ISetupInstance"/> objects.
0286 /// </summary>
0287 struct DECLSPEC_UUID("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")
0288     DECLSPEC_NOVTABLE IEnumSetupInstances : public IUnknown {
0289   /// <summary>
0290   /// Retrieves the next set of product instances in the enumeration sequence.
0291   /// </summary>
0292   /// <param name="celt">The number of product instances to retrieve.</param>
0293   /// <param name="rgelt">A pointer to an array of <see
0294   /// cref="ISetupInstance"/>.</param>
0295   /// <param name="pceltFetched">A pointer to the number of product instances
0296   /// retrieved. If celt is 1 this parameter may be NULL.</param>
0297   /// <returns>S_OK if the number of elements were fetched, S_FALSE if nothing
0298   /// was fetched (at end of enumeration), E_INVALIDARG if celt is greater than
0299   /// 1 and pceltFetched is NULL, or E_OUTOFMEMORY if an <see
0300   /// cref="ISetupInstance"/> could not be allocated.</returns>
0301   STDMETHOD(Next)
0302   (_In_ ULONG celt, _Out_writes_to_(celt, *pceltFetched) ISetupInstance **rgelt,
0303    _Out_opt_ _Deref_out_range_(0, celt) ULONG *pceltFetched) = 0;
0304 
0305   /// <summary>
0306   /// Skips the next set of product instances in the enumeration sequence.
0307   /// </summary>
0308   /// <param name="celt">The number of product instances to skip.</param>
0309   /// <returns>S_OK if the number of elements could be skipped; otherwise,
0310   /// S_FALSE;</returns>
0311   STDMETHOD(Skip)(_In_ ULONG celt) = 0;
0312 
0313   /// <summary>
0314   /// Resets the enumeration sequence to the beginning.
0315   /// </summary>
0316   /// <returns>Always returns S_OK;</returns>
0317   STDMETHOD(Reset)(void) = 0;
0318 
0319   /// <summary>
0320   /// Creates a new enumeration object in the same state as the current
0321   /// enumeration object: the new object points to the same place in the
0322   /// enumeration sequence.
0323   /// </summary>
0324   /// <param name="ppenum">A pointer to a pointer to a new <see
0325   /// cref="IEnumSetupInstances"/> interface. If the method fails, this
0326   /// parameter is undefined.</param>
0327   /// <returns>S_OK if a clone was returned; otherwise, E_OUTOFMEMORY.</returns>
0328   STDMETHOD(Clone)(_Deref_out_opt_ IEnumSetupInstances **ppenum) = 0;
0329 };
0330 #endif
0331 
0332 EXTERN_C const IID IID_ISetupConfiguration;
0333 
0334 #if defined(__cplusplus) && !defined(CINTERFACE)
0335 /// <summary>
0336 /// Gets information about product instances set up on the machine.
0337 /// </summary>
0338 struct DECLSPEC_UUID("42843719-DB4C-46C2-8E7C-64F1816EFD5B")
0339     DECLSPEC_NOVTABLE ISetupConfiguration : public IUnknown {
0340   /// <summary>
0341   /// Enumerates all completed product instances installed.
0342   /// </summary>
0343   /// <param name="ppEnumInstances">An enumeration of completed, installed
0344   /// product instances.</param>
0345   /// <returns>Standard HRESULT indicating success or failure.</returns>
0346   STDMETHOD(EnumInstances)(_Out_ IEnumSetupInstances **ppEnumInstances) = 0;
0347 
0348   /// <summary>
0349   /// Gets the instance for the current process path.
0350   /// </summary>
0351   /// <param name="ppInstance">The instance for the current process
0352   /// path.</param>
0353   /// <returns>The instance for the current process path, or E_NOTFOUND if not
0354   /// found.</returns>
0355   STDMETHOD(GetInstanceForCurrentProcess)
0356   (_Out_ ISetupInstance **ppInstance) = 0;
0357 
0358   /// <summary>
0359   /// Gets the instance for the given path.
0360   /// </summary>
0361   /// <param name="ppInstance">The instance for the given path.</param>
0362   /// <returns>The instance for the given path, or E_NOTFOUND if not
0363   /// found.</returns>
0364   STDMETHOD(GetInstanceForPath)
0365   (_In_z_ LPCWSTR wzPath, _Out_ ISetupInstance **ppInstance) = 0;
0366 };
0367 #endif
0368 
0369 EXTERN_C const IID IID_ISetupConfiguration2;
0370 
0371 #if defined(__cplusplus) && !defined(CINTERFACE)
0372 /// <summary>
0373 /// Gets information about product instances.
0374 /// </summary>
0375 struct DECLSPEC_UUID("26AAB78C-4A60-49D6-AF3B-3C35BC93365D")
0376     DECLSPEC_NOVTABLE ISetupConfiguration2 : public ISetupConfiguration {
0377   /// <summary>
0378   /// Enumerates all product instances.
0379   /// </summary>
0380   /// <param name="ppEnumInstances">An enumeration of all product
0381   /// instances.</param>
0382   /// <returns>Standard HRESULT indicating success or failure.</returns>
0383   STDMETHOD(EnumAllInstances)(_Out_ IEnumSetupInstances **ppEnumInstances) = 0;
0384 };
0385 #endif
0386 
0387 EXTERN_C const IID IID_ISetupPackageReference;
0388 
0389 #if defined(__cplusplus) && !defined(CINTERFACE)
0390 /// <summary>
0391 /// A reference to a package.
0392 /// </summary>
0393 struct DECLSPEC_UUID("da8d8a16-b2b6-4487-a2f1-594ccccd6bf5")
0394     DECLSPEC_NOVTABLE ISetupPackageReference : public IUnknown {
0395   /// <summary>
0396   /// Gets the general package identifier.
0397   /// </summary>
0398   /// <param name="pbstrId">The general package identifier.</param>
0399   /// <returns>Standard HRESULT indicating success or failure.</returns>
0400   STDMETHOD(GetId)(_Out_ BSTR *pbstrId) = 0;
0401 
0402   /// <summary>
0403   /// Gets the version of the package.
0404   /// </summary>
0405   /// <param name="pbstrVersion">The version of the package.</param>
0406   /// <returns>Standard HRESULT indicating success or failure.</returns>
0407   STDMETHOD(GetVersion)(_Out_ BSTR *pbstrVersion) = 0;
0408 
0409   /// <summary>
0410   /// Gets the target process architecture of the package.
0411   /// </summary>
0412   /// <param name="pbstrChip">The target process architecture of the
0413   /// package.</param>
0414   /// <returns>Standard HRESULT indicating success or failure.</returns>
0415   STDMETHOD(GetChip)(_Out_ BSTR *pbstrChip) = 0;
0416 
0417   /// <summary>
0418   /// Gets the language and optional region identifier.
0419   /// </summary>
0420   /// <param name="pbstrLanguage">The language and optional region
0421   /// identifier.</param>
0422   /// <returns>Standard HRESULT indicating success or failure.</returns>
0423   STDMETHOD(GetLanguage)(_Out_ BSTR *pbstrLanguage) = 0;
0424 
0425   /// <summary>
0426   /// Gets the build branch of the package.
0427   /// </summary>
0428   /// <param name="pbstrBranch">The build branch of the package.</param>
0429   /// <returns>Standard HRESULT indicating success or failure.</returns>
0430   STDMETHOD(GetBranch)(_Out_ BSTR *pbstrBranch) = 0;
0431 
0432   /// <summary>
0433   /// Gets the type of the package.
0434   /// </summary>
0435   /// <param name="pbstrType">The type of the package.</param>
0436   /// <returns>Standard HRESULT indicating success or failure.</returns>
0437   STDMETHOD(GetType)(_Out_ BSTR *pbstrType) = 0;
0438 
0439   /// <summary>
0440   /// Gets the unique identifier consisting of all defined tokens.
0441   /// </summary>
0442   /// <param name="pbstrUniqueId">The unique identifier consisting of all
0443   /// defined tokens.</param>
0444   /// <returns>Standard HRESULT indicating success or failure, including
0445   /// E_UNEXPECTED if no Id was defined (required).</returns>
0446   STDMETHOD(GetUniqueId)(_Out_ BSTR *pbstrUniqueId) = 0;
0447 };
0448 #endif
0449 
0450 EXTERN_C const IID IID_ISetupHelper;
0451 
0452 #if defined(__cplusplus) && !defined(CINTERFACE)
0453 /// <summary>
0454 /// Helper functions.
0455 /// </summary>
0456 /// <remarks>
0457 /// You can query for this interface from the <see cref="SetupConfiguration"/>
0458 /// class.
0459 /// </remarks>
0460 struct DECLSPEC_UUID("42b21b78-6192-463e-87bf-d577838f1d5c")
0461     DECLSPEC_NOVTABLE ISetupHelper : public IUnknown {
0462   /// <summary>
0463   /// Parses a dotted quad version string into a 64-bit unsigned integer.
0464   /// </summary>
0465   /// <param name="pwszVersion">The dotted quad version string to parse, e.g.
0466   /// 1.2.3.4.</param>
0467   /// <param name="pullVersion">A 64-bit unsigned integer representing the
0468   /// version. You can compare this to other versions.</param>
0469   /// <returns>Standard HRESULT indicating success or failure.</returns>
0470   STDMETHOD(ParseVersion)
0471   (_In_ LPCOLESTR pwszVersion, _Out_ PULONGLONG pullVersion) = 0;
0472 
0473   /// <summary>
0474   /// Parses a dotted quad version string into a 64-bit unsigned integer.
0475   /// </summary>
0476   /// <param name="pwszVersionRange">The string containing 1 or 2 dotted quad
0477   /// version strings to parse, e.g. [1.0,) that means 1.0.0.0 or newer.</param>
0478   /// <param name="pullMinVersion">A 64-bit unsigned integer representing the
0479   /// minimum version, which may be 0. You can compare this to other
0480   /// versions.</param>
0481   /// <param name="pullMaxVersion">A 64-bit unsigned integer representing the
0482   /// maximum version, which may be MAXULONGLONG. You can compare this to other
0483   /// versions.</param>
0484   /// <returns>Standard HRESULT indicating success or failure.</returns>
0485   STDMETHOD(ParseVersionRange)
0486   (_In_ LPCOLESTR pwszVersionRange, _Out_ PULONGLONG pullMinVersion,
0487    _Out_ PULONGLONG pullMaxVersion) = 0;
0488 };
0489 #endif
0490 
0491 // Class declarations
0492 //
0493 EXTERN_C const CLSID CLSID_SetupConfiguration;
0494 
0495 #ifdef __cplusplus
0496 /// <summary>
0497 /// This class implements <see cref="ISetupConfiguration"/>, <see
0498 /// cref="ISetupConfiguration2"/>, and <see cref="ISetupHelper"/>.
0499 /// </summary>
0500 class DECLSPEC_UUID("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D") SetupConfiguration;
0501 #endif
0502 
0503 // Function declarations
0504 //
0505 /// <summary>
0506 /// Gets an <see cref="ISetupConfiguration"/> that provides information about
0507 /// product instances installed on the machine.
0508 /// </summary>
0509 /// <param name="ppConfiguration">The <see cref="ISetupConfiguration"/> that
0510 /// provides information about product instances installed on the
0511 /// machine.</param>
0512 /// <param name="pReserved">Reserved for future use.</param>
0513 /// <returns>Standard HRESULT indicating success or failure.</returns>
0514 STDMETHODIMP GetSetupConfiguration(_Out_ ISetupConfiguration **ppConfiguration,
0515                                    _Reserved_ LPVOID pReserved);
0516 
0517 #ifdef __cplusplus
0518 }
0519 #endif
0520 
0521 #ifdef __clang__
0522 #pragma clang diagnostic pop
0523 #endif