MSVCSetupApi.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. // <copyright file="Program.cpp" company="Microsoft Corporation">
  2. // Copyright (C) Microsoft Corporation. All rights reserved.
  3. // Licensed under the MIT license.
  4. // </copyright>
  5. // <license>
  6. // The MIT License (MIT)
  7. //
  8. // Copyright (C) Microsoft Corporation. All rights reserved.
  9. //
  10. // Permission is hereby granted, free of charge, to any person obtaining
  11. // a copy of this software and associated documentation files (the "Software"),
  12. // to deal in the Software without restriction, including without limitation the
  13. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  14. // sell copies of the Software, and to permit persons to whom the Software is
  15. // furnished to do so, subject to the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be included in
  18. // all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  23. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  24. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  25. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  26. // SOFTWARE.
  27. // </license>
  28. #pragma once
  29. #ifdef __clang__
  30. #pragma clang diagnostic push
  31. #pragma clang diagnostic ignored "-Wnon-virtual-dtor"
  32. #endif
  33. // Constants
  34. //
  35. #ifndef E_NOTFOUND
  36. #define E_NOTFOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND)
  37. #endif
  38. #ifndef E_FILENOTFOUND
  39. #define E_FILENOTFOUND HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)
  40. #endif
  41. // Enumerations
  42. //
  43. /// <summary>
  44. /// The state of an instance.
  45. /// </summary>
  46. enum InstanceState : unsigned {
  47. /// <summary>
  48. /// The instance state has not been determined.
  49. /// </summary>
  50. eNone = 0,
  51. /// <summary>
  52. /// The instance installation path exists.
  53. /// </summary>
  54. eLocal = 1,
  55. /// <summary>
  56. /// A product is registered to the instance.
  57. /// </summary>
  58. eRegistered = 2,
  59. /// <summary>
  60. /// No reboot is required for the instance.
  61. /// </summary>
  62. eNoRebootRequired = 4,
  63. /// <summary>
  64. /// The instance represents a complete install.
  65. /// </summary>
  66. eComplete = MAXUINT,
  67. };
  68. // Forward interface declarations
  69. //
  70. #ifndef __ISetupInstance_FWD_DEFINED__
  71. #define __ISetupInstance_FWD_DEFINED__
  72. typedef struct ISetupInstance ISetupInstance;
  73. #endif
  74. #ifndef __ISetupInstance2_FWD_DEFINED__
  75. #define __ISetupInstance2_FWD_DEFINED__
  76. typedef struct ISetupInstance2 ISetupInstance2;
  77. #endif
  78. #ifndef __IEnumSetupInstances_FWD_DEFINED__
  79. #define __IEnumSetupInstances_FWD_DEFINED__
  80. typedef struct IEnumSetupInstances IEnumSetupInstances;
  81. #endif
  82. #ifndef __ISetupConfiguration_FWD_DEFINED__
  83. #define __ISetupConfiguration_FWD_DEFINED__
  84. typedef struct ISetupConfiguration ISetupConfiguration;
  85. #endif
  86. #ifndef __ISetupConfiguration2_FWD_DEFINED__
  87. #define __ISetupConfiguration2_FWD_DEFINED__
  88. typedef struct ISetupConfiguration2 ISetupConfiguration2;
  89. #endif
  90. #ifndef __ISetupPackageReference_FWD_DEFINED__
  91. #define __ISetupPackageReference_FWD_DEFINED__
  92. typedef struct ISetupPackageReference ISetupPackageReference;
  93. #endif
  94. #ifndef __ISetupHelper_FWD_DEFINED__
  95. #define __ISetupHelper_FWD_DEFINED__
  96. typedef struct ISetupHelper ISetupHelper;
  97. #endif
  98. // Forward class declarations
  99. //
  100. #ifndef __SetupConfiguration_FWD_DEFINED__
  101. #define __SetupConfiguration_FWD_DEFINED__
  102. #ifdef __cplusplus
  103. typedef class SetupConfiguration SetupConfiguration;
  104. #endif
  105. #endif
  106. #ifdef __cplusplus
  107. extern "C" {
  108. #endif
  109. // Interface definitions
  110. //
  111. EXTERN_C const IID IID_ISetupInstance;
  112. #if defined(__cplusplus) && !defined(CINTERFACE)
  113. /// <summary>
  114. /// Information about an instance of a product.
  115. /// </summary>
  116. struct DECLSPEC_UUID("B41463C3-8866-43B5-BC33-2B0676F7F42E")
  117. DECLSPEC_NOVTABLE ISetupInstance : public IUnknown {
  118. /// <summary>
  119. /// Gets the instance identifier (should match the name of the parent instance
  120. /// directory).
  121. /// </summary>
  122. /// <param name="pbstrInstanceId">The instance identifier.</param>
  123. /// <returns>Standard HRESULT indicating success or failure, including
  124. /// E_FILENOTFOUND if the instance state does not exist.</returns>
  125. STDMETHOD(GetInstanceId)(_Out_ BSTR *pbstrInstanceId) = 0;
  126. /// <summary>
  127. /// Gets the local date and time when the installation was originally
  128. /// installed.
  129. /// </summary>
  130. /// <param name="pInstallDate">The local date and time when the installation
  131. /// was originally installed.</param>
  132. /// <returns>Standard HRESULT indicating success or failure, including
  133. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  134. /// property is not defined.</returns>
  135. STDMETHOD(GetInstallDate)(_Out_ LPFILETIME pInstallDate) = 0;
  136. /// <summary>
  137. /// Gets the unique name of the installation, often indicating the branch and
  138. /// other information used for telemetry.
  139. /// </summary>
  140. /// <param name="pbstrInstallationName">The unique name of the installation,
  141. /// often indicating the branch and other information used for
  142. /// telemetry.</param>
  143. /// <returns>Standard HRESULT indicating success or failure, including
  144. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  145. /// property is not defined.</returns>
  146. STDMETHOD(GetInstallationName)(_Out_ BSTR *pbstrInstallationName) = 0;
  147. /// <summary>
  148. /// Gets the path to the installation root of the product.
  149. /// </summary>
  150. /// <param name="pbstrInstallationPath">The path to the installation root of
  151. /// the product.</param>
  152. /// <returns>Standard HRESULT indicating success or failure, including
  153. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  154. /// property is not defined.</returns>
  155. STDMETHOD(GetInstallationPath)(_Out_ BSTR *pbstrInstallationPath) = 0;
  156. /// <summary>
  157. /// Gets the version of the product installed in this instance.
  158. /// </summary>
  159. /// <param name="pbstrInstallationVersion">The version of the product
  160. /// installed in this instance.</param>
  161. /// <returns>Standard HRESULT indicating success or failure, including
  162. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  163. /// property is not defined.</returns>
  164. STDMETHOD(GetInstallationVersion)(_Out_ BSTR *pbstrInstallationVersion) = 0;
  165. /// <summary>
  166. /// Gets the display name (title) of the product installed in this instance.
  167. /// </summary>
  168. /// <param name="lcid">The LCID for the display name.</param>
  169. /// <param name="pbstrDisplayName">The display name (title) of the product
  170. /// installed in this instance.</param>
  171. /// <returns>Standard HRESULT indicating success or failure, including
  172. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  173. /// property is not defined.</returns>
  174. STDMETHOD(GetDisplayName)(_In_ LCID lcid, _Out_ BSTR *pbstrDisplayName) = 0;
  175. /// <summary>
  176. /// Gets the description of the product installed in this instance.
  177. /// </summary>
  178. /// <param name="lcid">The LCID for the description.</param>
  179. /// <param name="pbstrDescription">The description of the product installed in
  180. /// this instance.</param>
  181. /// <returns>Standard HRESULT indicating success or failure, including
  182. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  183. /// property is not defined.</returns>
  184. STDMETHOD(GetDescription)(_In_ LCID lcid, _Out_ BSTR *pbstrDescription) = 0;
  185. /// <summary>
  186. /// Resolves the optional relative path to the root path of the instance.
  187. /// </summary>
  188. /// <param name="pwszRelativePath">A relative path within the instance to
  189. /// resolve, or NULL to get the root path.</param>
  190. /// <param name="pbstrAbsolutePath">The full path to the optional relative
  191. /// path within the instance. If the relative path is NULL, the root path will
  192. /// always terminate in a backslash.</param>
  193. /// <returns>Standard HRESULT indicating success or failure, including
  194. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  195. /// property is not defined.</returns>
  196. STDMETHOD(ResolvePath)
  197. (_In_opt_z_ LPCOLESTR pwszRelativePath, _Out_ BSTR *pbstrAbsolutePath) = 0;
  198. };
  199. #endif
  200. EXTERN_C const IID IID_ISetupInstance2;
  201. #if defined(__cplusplus) && !defined(CINTERFACE)
  202. /// <summary>
  203. /// Information about an instance of a product.
  204. /// </summary>
  205. struct DECLSPEC_UUID("89143C9A-05AF-49B0-B717-72E218A2185C")
  206. DECLSPEC_NOVTABLE ISetupInstance2 : public ISetupInstance {
  207. /// <summary>
  208. /// Gets the state of the instance.
  209. /// </summary>
  210. /// <param name="pState">The state of the instance.</param>
  211. /// <returns>Standard HRESULT indicating success or failure, including
  212. /// E_FILENOTFOUND if the instance state does not exist.</returns>
  213. STDMETHOD(GetState)(_Out_ InstanceState *pState) = 0;
  214. /// <summary>
  215. /// Gets an array of package references registered to the instance.
  216. /// </summary>
  217. /// <param name="ppsaPackages">Pointer to an array of <see
  218. /// cref="ISetupPackageReference"/>.</param>
  219. /// <returns>Standard HRESULT indicating success or failure, including
  220. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  221. /// packages property is not defined.</returns>
  222. STDMETHOD(GetPackages)(_Out_ LPSAFEARRAY *ppsaPackages) = 0;
  223. /// <summary>
  224. /// Gets a pointer to the <see cref="ISetupPackageReference"/> that represents
  225. /// the registered product.
  226. /// </summary>
  227. /// <param name="ppPackage">Pointer to an instance of <see
  228. /// cref="ISetupPackageReference"/>. This may be NULL if <see
  229. /// cref="GetState"/> does not return <see cref="eComplete"/>.</param>
  230. /// <returns>Standard HRESULT indicating success or failure, including
  231. /// E_FILENOTFOUND if the instance state does not exist and E_NOTFOUND if the
  232. /// packages property is not defined.</returns>
  233. STDMETHOD(GetProduct)
  234. (_Outptr_result_maybenull_ ISetupPackageReference **ppPackage) = 0;
  235. /// <summary>
  236. /// Gets the relative path to the product application, if available.
  237. /// </summary>
  238. /// <param name="pbstrProductPath">The relative path to the product
  239. /// application, if available.</param>
  240. /// <returns>Standard HRESULT indicating success or failure, including
  241. /// E_FILENOTFOUND if the instance state does not exist.</returns>
  242. STDMETHOD(GetProductPath)
  243. (_Outptr_result_maybenull_ BSTR *pbstrProductPath) = 0;
  244. };
  245. #endif
  246. EXTERN_C const IID IID_IEnumSetupInstances;
  247. #if defined(__cplusplus) && !defined(CINTERFACE)
  248. /// <summary>
  249. /// A enumerator of installed <see cref="ISetupInstance"/> objects.
  250. /// </summary>
  251. struct DECLSPEC_UUID("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")
  252. DECLSPEC_NOVTABLE IEnumSetupInstances : public IUnknown {
  253. /// <summary>
  254. /// Retrieves the next set of product instances in the enumeration sequence.
  255. /// </summary>
  256. /// <param name="celt">The number of product instances to retrieve.</param>
  257. /// <param name="rgelt">A pointer to an array of <see
  258. /// cref="ISetupInstance"/>.</param>
  259. /// <param name="pceltFetched">A pointer to the number of product instances
  260. /// retrieved. If celt is 1 this parameter may be NULL.</param>
  261. /// <returns>S_OK if the number of elements were fetched, S_FALSE if nothing
  262. /// was fetched (at end of enumeration), E_INVALIDARG if celt is greater than
  263. /// 1 and pceltFetched is NULL, or E_OUTOFMEMORY if an <see
  264. /// cref="ISetupInstance"/> could not be allocated.</returns>
  265. STDMETHOD(Next)
  266. (_In_ ULONG celt, _Out_writes_to_(celt, *pceltFetched) ISetupInstance **rgelt,
  267. _Out_opt_ _Deref_out_range_(0, celt) ULONG *pceltFetched) = 0;
  268. /// <summary>
  269. /// Skips the next set of product instances in the enumeration sequence.
  270. /// </summary>
  271. /// <param name="celt">The number of product instances to skip.</param>
  272. /// <returns>S_OK if the number of elements could be skipped; otherwise,
  273. /// S_FALSE;</returns>
  274. STDMETHOD(Skip)(_In_ ULONG celt) = 0;
  275. /// <summary>
  276. /// Resets the enumeration sequence to the beginning.
  277. /// </summary>
  278. /// <returns>Always returns S_OK;</returns>
  279. STDMETHOD(Reset)(void) = 0;
  280. /// <summary>
  281. /// Creates a new enumeration object in the same state as the current
  282. /// enumeration object: the new object points to the same place in the
  283. /// enumeration sequence.
  284. /// </summary>
  285. /// <param name="ppenum">A pointer to a pointer to a new <see
  286. /// cref="IEnumSetupInstances"/> interface. If the method fails, this
  287. /// parameter is undefined.</param>
  288. /// <returns>S_OK if a clone was returned; otherwise, E_OUTOFMEMORY.</returns>
  289. STDMETHOD(Clone)(_Deref_out_opt_ IEnumSetupInstances **ppenum) = 0;
  290. };
  291. #endif
  292. EXTERN_C const IID IID_ISetupConfiguration;
  293. #if defined(__cplusplus) && !defined(CINTERFACE)
  294. /// <summary>
  295. /// Gets information about product instances set up on the machine.
  296. /// </summary>
  297. struct DECLSPEC_UUID("42843719-DB4C-46C2-8E7C-64F1816EFD5B")
  298. DECLSPEC_NOVTABLE ISetupConfiguration : public IUnknown {
  299. /// <summary>
  300. /// Enumerates all completed product instances installed.
  301. /// </summary>
  302. /// <param name="ppEnumInstances">An enumeration of completed, installed
  303. /// product instances.</param>
  304. /// <returns>Standard HRESULT indicating success or failure.</returns>
  305. STDMETHOD(EnumInstances)(_Out_ IEnumSetupInstances **ppEnumInstances) = 0;
  306. /// <summary>
  307. /// Gets the instance for the current process path.
  308. /// </summary>
  309. /// <param name="ppInstance">The instance for the current process
  310. /// path.</param>
  311. /// <returns>The instance for the current process path, or E_NOTFOUND if not
  312. /// found.</returns>
  313. STDMETHOD(GetInstanceForCurrentProcess)
  314. (_Out_ ISetupInstance **ppInstance) = 0;
  315. /// <summary>
  316. /// Gets the instance for the given path.
  317. /// </summary>
  318. /// <param name="ppInstance">The instance for the given path.</param>
  319. /// <returns>The instance for the given path, or E_NOTFOUND if not
  320. /// found.</returns>
  321. STDMETHOD(GetInstanceForPath)
  322. (_In_z_ LPCWSTR wzPath, _Out_ ISetupInstance **ppInstance) = 0;
  323. };
  324. #endif
  325. EXTERN_C const IID IID_ISetupConfiguration2;
  326. #if defined(__cplusplus) && !defined(CINTERFACE)
  327. /// <summary>
  328. /// Gets information about product instances.
  329. /// </summary>
  330. struct DECLSPEC_UUID("26AAB78C-4A60-49D6-AF3B-3C35BC93365D")
  331. DECLSPEC_NOVTABLE ISetupConfiguration2 : public ISetupConfiguration {
  332. /// <summary>
  333. /// Enumerates all product instances.
  334. /// </summary>
  335. /// <param name="ppEnumInstances">An enumeration of all product
  336. /// instances.</param>
  337. /// <returns>Standard HRESULT indicating success or failure.</returns>
  338. STDMETHOD(EnumAllInstances)(_Out_ IEnumSetupInstances **ppEnumInstances) = 0;
  339. };
  340. #endif
  341. EXTERN_C const IID IID_ISetupPackageReference;
  342. #if defined(__cplusplus) && !defined(CINTERFACE)
  343. /// <summary>
  344. /// A reference to a package.
  345. /// </summary>
  346. struct DECLSPEC_UUID("da8d8a16-b2b6-4487-a2f1-594ccccd6bf5")
  347. DECLSPEC_NOVTABLE ISetupPackageReference : public IUnknown {
  348. /// <summary>
  349. /// Gets the general package identifier.
  350. /// </summary>
  351. /// <param name="pbstrId">The general package identifier.</param>
  352. /// <returns>Standard HRESULT indicating success or failure.</returns>
  353. STDMETHOD(GetId)(_Out_ BSTR *pbstrId) = 0;
  354. /// <summary>
  355. /// Gets the version of the package.
  356. /// </summary>
  357. /// <param name="pbstrVersion">The version of the package.</param>
  358. /// <returns>Standard HRESULT indicating success or failure.</returns>
  359. STDMETHOD(GetVersion)(_Out_ BSTR *pbstrVersion) = 0;
  360. /// <summary>
  361. /// Gets the target process architecture of the package.
  362. /// </summary>
  363. /// <param name="pbstrChip">The target process architecture of the
  364. /// package.</param>
  365. /// <returns>Standard HRESULT indicating success or failure.</returns>
  366. STDMETHOD(GetChip)(_Out_ BSTR *pbstrChip) = 0;
  367. /// <summary>
  368. /// Gets the language and optional region identifier.
  369. /// </summary>
  370. /// <param name="pbstrLanguage">The language and optional region
  371. /// identifier.</param>
  372. /// <returns>Standard HRESULT indicating success or failure.</returns>
  373. STDMETHOD(GetLanguage)(_Out_ BSTR *pbstrLanguage) = 0;
  374. /// <summary>
  375. /// Gets the build branch of the package.
  376. /// </summary>
  377. /// <param name="pbstrBranch">The build branch of the package.</param>
  378. /// <returns>Standard HRESULT indicating success or failure.</returns>
  379. STDMETHOD(GetBranch)(_Out_ BSTR *pbstrBranch) = 0;
  380. /// <summary>
  381. /// Gets the type of the package.
  382. /// </summary>
  383. /// <param name="pbstrType">The type of the package.</param>
  384. /// <returns>Standard HRESULT indicating success or failure.</returns>
  385. STDMETHOD(GetType)(_Out_ BSTR *pbstrType) = 0;
  386. /// <summary>
  387. /// Gets the unique identifier consisting of all defined tokens.
  388. /// </summary>
  389. /// <param name="pbstrUniqueId">The unique identifier consisting of all
  390. /// defined tokens.</param>
  391. /// <returns>Standard HRESULT indicating success or failure, including
  392. /// E_UNEXPECTED if no Id was defined (required).</returns>
  393. STDMETHOD(GetUniqueId)(_Out_ BSTR *pbstrUniqueId) = 0;
  394. };
  395. #endif
  396. EXTERN_C const IID IID_ISetupHelper;
  397. #if defined(__cplusplus) && !defined(CINTERFACE)
  398. /// <summary>
  399. /// Helper functions.
  400. /// </summary>
  401. /// <remarks>
  402. /// You can query for this interface from the <see cref="SetupConfiguration"/>
  403. /// class.
  404. /// </remarks>
  405. struct DECLSPEC_UUID("42b21b78-6192-463e-87bf-d577838f1d5c")
  406. DECLSPEC_NOVTABLE ISetupHelper : public IUnknown {
  407. /// <summary>
  408. /// Parses a dotted quad version string into a 64-bit unsigned integer.
  409. /// </summary>
  410. /// <param name="pwszVersion">The dotted quad version string to parse, e.g.
  411. /// 1.2.3.4.</param>
  412. /// <param name="pullVersion">A 64-bit unsigned integer representing the
  413. /// version. You can compare this to other versions.</param>
  414. /// <returns>Standard HRESULT indicating success or failure.</returns>
  415. STDMETHOD(ParseVersion)
  416. (_In_ LPCOLESTR pwszVersion, _Out_ PULONGLONG pullVersion) = 0;
  417. /// <summary>
  418. /// Parses a dotted quad version string into a 64-bit unsigned integer.
  419. /// </summary>
  420. /// <param name="pwszVersionRange">The string containing 1 or 2 dotted quad
  421. /// version strings to parse, e.g. [1.0,) that means 1.0.0.0 or newer.</param>
  422. /// <param name="pullMinVersion">A 64-bit unsigned integer representing the
  423. /// minimum version, which may be 0. You can compare this to other
  424. /// versions.</param>
  425. /// <param name="pullMaxVersion">A 64-bit unsigned integer representing the
  426. /// maximum version, which may be MAXULONGLONG. You can compare this to other
  427. /// versions.</param>
  428. /// <returns>Standard HRESULT indicating success or failure.</returns>
  429. STDMETHOD(ParseVersionRange)
  430. (_In_ LPCOLESTR pwszVersionRange, _Out_ PULONGLONG pullMinVersion,
  431. _Out_ PULONGLONG pullMaxVersion) = 0;
  432. };
  433. #endif
  434. // Class declarations
  435. //
  436. EXTERN_C const CLSID CLSID_SetupConfiguration;
  437. #ifdef __cplusplus
  438. /// <summary>
  439. /// This class implements <see cref="ISetupConfiguration"/>, <see
  440. /// cref="ISetupConfiguration2"/>, and <see cref="ISetupHelper"/>.
  441. /// </summary>
  442. class DECLSPEC_UUID("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D") SetupConfiguration;
  443. #endif
  444. // Function declarations
  445. //
  446. /// <summary>
  447. /// Gets an <see cref="ISetupConfiguration"/> that provides information about
  448. /// product instances installed on the machine.
  449. /// </summary>
  450. /// <param name="ppConfiguration">The <see cref="ISetupConfiguration"/> that
  451. /// provides information about product instances installed on the
  452. /// machine.</param>
  453. /// <param name="pReserved">Reserved for future use.</param>
  454. /// <returns>Standard HRESULT indicating success or failure.</returns>
  455. STDMETHODIMP GetSetupConfiguration(_Out_ ISetupConfiguration **ppConfiguration,
  456. _Reserved_ LPVOID pReserved);
  457. #ifdef __cplusplus
  458. }
  459. #endif
  460. #ifdef __clang__
  461. #pragma clang diagnostic pop
  462. #endif