MSVCSetupApi.h 19 KB

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