/*** Autogenerated by WIDL 3.20 from include/comadmin.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __comadmin_h__
#define __comadmin_h__

/* Forward declarations */

#ifndef __ICOMAdminCatalog_FWD_DEFINED__
#define __ICOMAdminCatalog_FWD_DEFINED__
typedef interface ICOMAdminCatalog ICOMAdminCatalog;
#ifdef __cplusplus
interface ICOMAdminCatalog;
#endif /* __cplusplus */
#endif

#ifndef __ICOMAdminCatalog2_FWD_DEFINED__
#define __ICOMAdminCatalog2_FWD_DEFINED__
typedef interface ICOMAdminCatalog2 ICOMAdminCatalog2;
#ifdef __cplusplus
interface ICOMAdminCatalog2;
#endif /* __cplusplus */
#endif

#ifndef __ICatalogObject_FWD_DEFINED__
#define __ICatalogObject_FWD_DEFINED__
typedef interface ICatalogObject ICatalogObject;
#ifdef __cplusplus
interface ICatalogObject;
#endif /* __cplusplus */
#endif

#ifndef __ICatalogCollection_FWD_DEFINED__
#define __ICatalogCollection_FWD_DEFINED__
typedef interface ICatalogCollection ICatalogCollection;
#ifdef __cplusplus
interface ICatalogCollection;
#endif /* __cplusplus */
#endif

#ifndef __COMAdminCatalog_FWD_DEFINED__
#define __COMAdminCatalog_FWD_DEFINED__
#ifdef __cplusplus
typedef class COMAdminCatalog COMAdminCatalog;
#else
typedef struct COMAdminCatalog COMAdminCatalog;
#endif /* defined __cplusplus */
#endif /* defined __COMAdminCatalog_FWD_DEFINED__ */

#ifndef __COMAdminCatalogObject_FWD_DEFINED__
#define __COMAdminCatalogObject_FWD_DEFINED__
#ifdef __cplusplus
typedef class COMAdminCatalogObject COMAdminCatalogObject;
#else
typedef struct COMAdminCatalogObject COMAdminCatalogObject;
#endif /* defined __cplusplus */
#endif /* defined __COMAdminCatalogObject_FWD_DEFINED__ */

#ifndef __COMAdminCatalogCollection_FWD_DEFINED__
#define __COMAdminCatalogCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class COMAdminCatalogCollection COMAdminCatalogCollection;
#else
typedef struct COMAdminCatalogCollection COMAdminCatalogCollection;
#endif /* defined __cplusplus */
#endif /* defined __COMAdminCatalogCollection_FWD_DEFINED__ */

/* Headers for imported files */

#include <unknwn.h>
#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#include <objbase.h>

typedef enum COMAdminInUse {
    COMAdminNotInUse = 0,
    COMAdminInUseByCatalog = 1,
    COMAdminInUseByRegistryUnknown = 2,
    COMAdminInUseByRegistryProxyStub = 3,
    COMAdminInUseByRegistryTypeLib = 4,
    COMAdminInUseByRegistryClsid = 5
} COMAdminInUse;
typedef enum COMAdminErrorCodes {
    COMAdminErrObjectErrors = 0x80110401,
    COMAdminErrObjectInvalid = 0x80110402,
    COMAdminErrKeyMissing = 0x80110403,
    COMAdminErrAlreadyInstalled = 0x80110404,
    COMAdminErrAppFileWriteFail = 0x80110407,
    COMAdminErrAppFileReadFail = 0x80110408,
    COMAdminErrAppFileVersion = 0x80110409,
    COMAdminErrBadPath = 0x8011040a,
    COMAdminErrApplicationExists = 0x8011040b,
    COMAdminErrRoleExists = 0x8011040c,
    COMAdminErrCantCopyFile = 0x8011040d,
    COMAdminErrNoUser = 0x8011040f,
    COMAdminErrInvalidUserids = 0x80110410,
    COMAdminErrNoRegistryCLSID = 0x80110411,
    COMAdminErrBadRegistryProgID = 0x80110412,
    COMAdminErrAuthenticationLevel = 0x80110413,
    COMAdminErrUserPasswdNotValid = 0x80110414,
    COMAdminErrCLSIDOrIIDMismatch = 0x80110418,
    COMAdminErrRemoteInterface = 0x80110419,
    COMAdminErrDllRegisterServer = 0x8011041a,
    COMAdminErrNoServerShare = 0x8011041b,
    COMAdminErrDllLoadFailed = 0x8011041d,
    COMAdminErrBadRegistryLibID = 0x8011041e,
    COMAdminErrAppDirNotFound = 0x8011041f,
    COMAdminErrRegistrarFailed = 0x80110423,
    COMAdminErrCompFileDoesNotExist = 0x80110424,
    COMAdminErrCompFileLoadDLLFail = 0x80110425,
    COMAdminErrCompFileGetClassObj = 0x80110426,
    COMAdminErrCompFileClassNotAvail = 0x80110427,
    COMAdminErrCompFileBadTLB = 0x80110428,
    COMAdminErrCompFileNotInstallable = 0x80110429,
    COMAdminErrNotChangeable = 0x8011042a,
    COMAdminErrNotDeletable = 0x8011042b,
    COMAdminErrSession = 0x8011042c,
    COMAdminErrCompMoveLocked = 0x8011042d,
    COMAdminErrCompMoveBadDest = 0x8011042e,
    COMAdminErrRegisterTLB = 0x80110430,
    COMAdminErrSystemApp = 0x80110433,
    COMAdminErrCompFileNoRegistrar = 0x80110434,
    COMAdminErrCoReqCompInstalled = 0x80110435,
    COMAdminErrServiceNotInstalled = 0x80110436,
    COMAdminErrPropertySaveFailed = 0x80110437,
    COMAdminErrObjectExists = 0x80110438,
    COMAdminErrComponentExists = 0x80110439,
    COMAdminErrRegFileCorrupt = 0x8011043b,
    COMAdminErrPropertyOverflow = 0x8011043c,
    COMAdminErrNotInRegistry = 0x8011043e,
    COMAdminErrObjectNotPoolable = 0x8011043f,
    COMAdminErrApplidMatchesClsid = 0x80110446,
    COMAdminErrRoleDoesNotExist = 0x80110447,
    COMAdminErrStartAppNeedsComponents = 0x80110448,
    COMAdminErrRequiresDifferentPlatform = 0x80110449,
    COMAdminErrQueuingServiceNotAvailable = 0x80110602,
    COMAdminErrObjectParentMissing = 0x80110808,
    COMAdminErrObjectDoesNotExist = 0x80110809,
    COMAdminErrCanNotExportAppProxy = 0x8011044a,
    COMAdminErrCanNotStartApp = 0x8011044b,
    COMAdminErrCanNotExportSystemApp = 0x8011044c,
    COMAdminErrCanNotSubscribeToComponent = 0x8011044d,
    COMAdminErrAppNotRunning = 0x8011080a,
    COMAdminErrEventClassCannotBeSubscriber = 0x8011044e,
    COMAdminErrLibAppProxyIncompatible = 0x8011044f,
    COMAdminErrBasePartitionOnly = 0x80110450,
    COMAdminErrDuplicatePartitionName = 0x80110457,
    COMAdminErrPartitionInUse = 0x80110459,
    COMAdminErrImportedComponentsNotAllowed = 0x8011045b,
    COMAdminErrRegdbNotInitialized = 0x80110472,
    COMAdminErrRegdbNotOpen = 0x80110473,
    COMAdminErrRegdbSystemErr = 0x80110474,
    COMAdminErrRegdbAlreadyRunning = 0x80110475,
    COMAdminErrMigVersionNotSupported = 0x80110480,
    COMAdminErrMigSchemaNotFound = 0x80110481,
    COMAdminErrCatBitnessMismatch = 0x80110482,
    COMAdminErrCatUnacceptableBitness = 0x80110483,
    COMAdminErrCatWrongAppBitnessBitness = 0x80110484,
    COMAdminErrCatPauseResumeNotSupported = 0x80110485,
    COMAdminErrCatServerFault = 0x80110486,
    COMAdminErrCantRecycleLibraryApps = 0x8011080f,
    COMAdminErrCantRecycleServiceApps = 0x80110811,
    COMAdminErrProcessAlreadyRecycled = 0x80110812,
    COMAdminErrPausedProcessMayNotBeRecycled = 0x80110813,
    COMAdminErrInvalidPartition = 0x8011080b,
    COMAdminErrPartitionMsiOnly = 0x80110819,
    COMAdminErrStartAppDisabled = 0x80110451,
    COMAdminErrCompMoveSource = 0x8011081c,
    COMAdminErrCompMoveDest = 0x8011081d,
    COMAdminErrCompMovePrivate = 0x8011081e,
    COMAdminErrCannotCopyEventClass = 0x80110820
} COMAdminErrorCodes;
typedef enum COMAdminComponentType {
    COMAdmin32BitComponent = 0x1,
    COMAdmin64BitComponent = 0x2
} COMAdminComponentType;
typedef enum COMAdminApplicationInstallOptions {
    COMAdminInstallNoUsers = 0,
    COMAdminInstallUsers = 1,
    COMAdminInstallForceOverwriteOfFiles = 2
} COMAdminApplicationInstallOptions;
typedef enum COMAdminApplicationExportOptions {
    COMAdminExportNoUsers = 0x0,
    COMAdminExportUsers = 0x1,
    COMAdminExportApplicationProxy = 0x2,
    COMAdminExportForceOverwriteOfFiles = 0x4,
    COMAdminExportIn10Format = 0x10
} COMAdminApplicationExportOptions;
typedef enum COMAdminThreadingModels {
    COMAdminThreadingModelApartment = 0,
    COMAdminThreadingModelFree = 1,
    COMAdminThreadingModelMain = 2,
    COMAdminThreadingModelBoth = 3,
    COMAdminThreadingModelNeutral = 4,
    COMAdminThreadingModelNotSpecified = 5
} COMAdminThreadingModels;
typedef enum COMAdminTransactionOptions {
    COMAdminTransactionIgnored = 0,
    COMAdminTransactionNone = 1,
    COMAdminTransactionSupported = 2,
    COMAdminTransactionRequired = 3,
    COMAdminTransactionRequiresNew = 4
} COMAdminTransactionOptions;
typedef enum COMAdminTxIsolationLevelOptions {
    COMAdminTxIsolationLevelAny = 0,
    COMAdminTxIsolationLevelReadUnCommitted = 1,
    COMAdminTxIsolationLevelReadCommitted = 2,
    COMAdminTxIsolationLevelRepeatableRead = 3,
    COMAdminTxIsolationLevelSerializable = 4
} COMAdminTxIsolationLevelOptions;
typedef enum COMAdminSynchronizationOptions {
    COMAdminSynchronizationIgnored = 0,
    COMAdminSynchronizationNone = 1,
    COMAdminSynchronizationSupported = 2,
    COMAdminSynchronizationRequired = 3,
    COMAdminSynchronizationRequiresNew = 4
} COMAdminSynchronizationOptions;
typedef enum COMAdminActivationOptions {
    COMAdminActivationInproc = 0,
    COMAdminActivationLocal = 1
} COMAdminActivationOptions;
typedef enum COMAdminAccessChecksLevelOptions {
    COMAdminAccessChecksApplicationLevel = 0,
    COMAdminAccessChecksApplicationComponentLevel = 1
} COMAdminAccessChecksLevelOptions;
typedef enum COMAdminAuthenticationLevelOptions {
    COMAdminAuthenticationDefault = 0,
    COMAdminAuthenticationNone = 1,
    COMAdminAuthenticationConnect = 2,
    COMAdminAuthenticationCall = 3,
    COMAdminAuthenticationPacket = 4,
    COMAdminAuthenticationIntegrity = 5,
    COMAdminAuthenticationPrivacy = 6
} COMAdminAuthenticationLevelOptions;
typedef enum COMAdminImpersonationLevelOptions {
    COMAdminImpersonationAnonymous = 1,
    COMAdminImpersonationIdentify = 2,
    COMAdminImpersonationImpersonate = 3,
    COMAdminImpersonationDelegate = 4
} COMAdminImpersonationLevelOptions;
typedef enum COMAdminAuthenticationCapabilitiesOptions {
    COMAdminAuthenticationCapabilitiesNone = 0x0,
    COMAdminAuthenticationCapabilitiesSecureReference = 0x2,
    COMAdminAuthenticationCapabilitiesStaticCloaking = 0x20,
    COMAdminAuthenticationCapabilitiesDynamicCloaking = 0x40
} COMAdminAuthenticationCapabilitiesOptions;
typedef enum COMAdminOS {
    COMAdminOSNotInitialized = 0,
    COMAdminOSWindows3_1 = 1,
    COMAdminOSWindows9x = 2,
    COMAdminOSWindows2000 = 3,
    COMAdminOSWindows2000AdvancedServer = 4,
    COMAdminOSWindows2000Unknown = 5,
    COMAdminOSUnknown = 6,
    COMAdminOSWindowsXPPersonal = 11,
    COMAdminOSWindowsXPProfessional = 12,
    COMAdminOSWindowsNETStandardServer = 13,
    COMAdminOSWindowsNETEnterpriseServer = 14,
    COMAdminOSWindowsNETDatacenterServer = 15,
    COMAdminOSWindowsNETWebServer = 16,
    COMAdminOSWindowsLonghornPersonal = 17,
    COMAdminOSWindowsLonghornProfessional = 18,
    COMAdminOSWindowsLonghornStandardServer = 19,
    COMAdminOSWindowsLonghornEnterpriseServer = 20,
    COMAdminOSWindowsLonghornDatacenterServer = 21,
    COMAdminOSWindowsLonghornWebServer = 22,
    COMAdminOSWindows7Personal = 23,
    COMAdminOSWindows7Professional = 24,
    COMAdminOSWindows7StandardServer = 25,
    COMAdminOSWindows7EnterpriseServer = 26,
    COMAdminOSWindows7DatacenterServer = 27,
    COMAdminOSWindows7WebServer = 28,
    COMAdminOSWindows8Personal = 29,
    COMAdminOSWindows8Professional = 30,
    COMAdminOSWindows8StandardServer = 31,
    COMAdminOSWindows8EnterpriseServer = 32,
    COMAdminOSWindows8DatacenterServer = 33,
    COMAdminOSWindows8WebServer = 34
} COMAdminOS;
typedef enum COMAdminServiceOptions {
    COMAdminServiceLoadBalanceRouter = 1
} COMAdminServiceOptions;
typedef enum COMAdminServiceStatusOptions {
    COMAdminServiceStopped = 0,
    COMAdminServiceStartPending = 1,
    COMAdminServiceStopPending = 2,
    COMAdminServiceRunning = 3,
    COMAdminServiceContinuePending = 4,
    COMAdminServicePausePending = 5,
    COMAdminServicePaused = 6,
    COMAdminServiceUnknownState = 7
} COMAdminServiceStatusOptions;
typedef enum COMAdminComponentFlags {
    COMAdminCompFlagTypeInfoFound = 0x1,
    COMAdminCompFlagCOMPlusPropertiesFound = 0x2,
    COMAdminCompFlagProxyFound = 0x4,
    COMAdminCompFlagInterfacesFound = 0x8,
    COMAdminCompFlagAlreadyInstalled = 0x10,
    COMAdminCompFlagNotInApplication = 0x20
} COMAdminComponentFlags;
typedef enum COMAdminQCMessageAuthenticateOptions {
    COMAdminQCMessageAuthenticateSecureApps = 0,
    COMAdminQCMessageAuthenticateOff = 1,
    COMAdminQCMessageAuthenticateOn = 2
} COMAdminQCMessageAuthenticateOptions;
typedef enum COMAdminFileFlags {
    COMAdminFileFlagLoadable = 0x1,
    COMAdminFileFlagCOM = 0x2,
    COMAdminFileFlagContainsPS = 0x4,
    COMAdminFileFlagContainsComp = 0x8,
    COMAdminFileFlagContainsTLB = 0x10,
    COMAdminFileFlagSelfReg = 0x20,
    COMAdminFileFlagSelfUnReg = 0x40,
    COMAdminFileFlagUnloadableDLL = 0x80,
    COMAdminFileFlagDoesNotExist = 0x100,
    COMAdminFileFlagAlreadyInstalled = 0x200,
    COMAdminFileFlagBadTLB = 0x400,
    COMAdminFileFlagGetClassObjFailed = 0x800,
    COMAdminFileFlagClassNotAvailable = 0x1000,
    COMAdminFileFlagRegistrar = 0x2000,
    COMAdminFileFlagNoRegistrar = 0x4000,
    COMAdminFileFlagDLLRegsvrFailed = 0x8000,
    COMAdminFileFlagRegTLBFailed = 0x10000,
    COMAdminFileFlagRegistrarFailed = 0x20000,
    COMAdminFileFlagError = 0x40000
} COMAdminFileFlags;
/*****************************************************************************
 * ICOMAdminCatalog interface
 */
#ifndef __ICOMAdminCatalog_INTERFACE_DEFINED__
#define __ICOMAdminCatalog_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICOMAdminCatalog, 0xdd662187, 0xdfc2, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dd662187-dfc2-11d1-a2cf-00805fc79235")
ICOMAdminCatalog : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE GetCollection(
        BSTR bstrCollName,
        IDispatch **ppCatalogCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE Connect(
        BSTR bstrCatalogServerName,
        IDispatch **ppCatalogCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MajorVersion(
        LONG *plMajorVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MinorVersion(
        LONG *plMinorVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCollectionByQuery(
        BSTR bstrCollName,
        SAFEARRAY **ppsaVarQuery,
        IDispatch **ppCatalogCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE ImportComponent(
        BSTR bstrApplIDOrName,
        BSTR bstrCLSIDOrProgID) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstallComponent(
        BSTR bstrApplIDOrName,
        BSTR bstrDLL,
        BSTR bstrTLB,
        BSTR bstrPSDLL) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShutdownApplication(
        BSTR bstrApplIDOrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExportApplication(
        BSTR bstrApplIDOrName,
        BSTR bstrApplicationFile,
        LONG lOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstallApplication(
        BSTR bstrApplicationFile,
        BSTR bstrDestinationDirectory,
        LONG lOptions,
        BSTR bstrUserId,
        BSTR bstrPassword,
        BSTR bstrRSN) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopRouter(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RefreshRouter(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartRouter(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reserved1(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reserved2(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstallMultipleComponents(
        BSTR bstrApplIDOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMultipleComponentsInfo(
        BSTR bstrApplIdOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDs,
        SAFEARRAY **ppsaVarClassNames,
        SAFEARRAY **ppsaVarFileFlags,
        SAFEARRAY **ppsaVarComponentFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE RefreshComponents(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE BackupREGDB(
        BSTR bstrBackupFilePath) = 0;

    virtual HRESULT STDMETHODCALLTYPE RestoreREGDB(
        BSTR bstrBackupFilePath) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryApplicationFile(
        BSTR bstrApplicationFile,
        BSTR *pbstrApplicationName,
        BSTR *pbstrApplicationDescription,
        VARIANT_BOOL *pbHasUsers,
        VARIANT_BOOL *pbIsProxy,
        SAFEARRAY **ppsaVarFileNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartApplication(
        BSTR bstrApplIdOrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE ServiceCheck(
        LONG lService,
        LONG *plStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstallMultipleEventClasses(
        BSTR bstrApplIdOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDS) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstallEventClass(
        BSTR bstrApplIdOrName,
        BSTR bstrDLL,
        BSTR bstrTLB,
        BSTR bstrPSDLL) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventClassesForIID(
        BSTR bstrIID,
        SAFEARRAY **ppsaVarCLSIDs,
        SAFEARRAY **ppsaVarProgIDs,
        SAFEARRAY **ppsaVarDescriptions) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICOMAdminCatalog, 0xdd662187, 0xdfc2, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35)
#endif
#else
typedef struct ICOMAdminCatalogVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICOMAdminCatalog *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICOMAdminCatalog *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICOMAdminCatalog *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICOMAdminCatalog *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICOMAdminCatalog *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICOMAdminCatalog *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICOMAdminCatalog *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICOMAdminCatalog methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCollection)(
        ICOMAdminCatalog *This,
        BSTR bstrCollName,
        IDispatch **ppCatalogCollection);

    HRESULT (STDMETHODCALLTYPE *Connect)(
        ICOMAdminCatalog *This,
        BSTR bstrCatalogServerName,
        IDispatch **ppCatalogCollection);

    HRESULT (STDMETHODCALLTYPE *get_MajorVersion)(
        ICOMAdminCatalog *This,
        LONG *plMajorVersion);

    HRESULT (STDMETHODCALLTYPE *get_MinorVersion)(
        ICOMAdminCatalog *This,
        LONG *plMinorVersion);

    HRESULT (STDMETHODCALLTYPE *GetCollectionByQuery)(
        ICOMAdminCatalog *This,
        BSTR bstrCollName,
        SAFEARRAY **ppsaVarQuery,
        IDispatch **ppCatalogCollection);

    HRESULT (STDMETHODCALLTYPE *ImportComponent)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIDOrName,
        BSTR bstrCLSIDOrProgID);

    HRESULT (STDMETHODCALLTYPE *InstallComponent)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIDOrName,
        BSTR bstrDLL,
        BSTR bstrTLB,
        BSTR bstrPSDLL);

    HRESULT (STDMETHODCALLTYPE *ShutdownApplication)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIDOrName);

    HRESULT (STDMETHODCALLTYPE *ExportApplication)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIDOrName,
        BSTR bstrApplicationFile,
        LONG lOptions);

    HRESULT (STDMETHODCALLTYPE *InstallApplication)(
        ICOMAdminCatalog *This,
        BSTR bstrApplicationFile,
        BSTR bstrDestinationDirectory,
        LONG lOptions,
        BSTR bstrUserId,
        BSTR bstrPassword,
        BSTR bstrRSN);

    HRESULT (STDMETHODCALLTYPE *StopRouter)(
        ICOMAdminCatalog *This);

    HRESULT (STDMETHODCALLTYPE *RefreshRouter)(
        ICOMAdminCatalog *This);

    HRESULT (STDMETHODCALLTYPE *StartRouter)(
        ICOMAdminCatalog *This);

    HRESULT (STDMETHODCALLTYPE *Reserved1)(
        ICOMAdminCatalog *This);

    HRESULT (STDMETHODCALLTYPE *Reserved2)(
        ICOMAdminCatalog *This);

    HRESULT (STDMETHODCALLTYPE *InstallMultipleComponents)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIDOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDs);

    HRESULT (STDMETHODCALLTYPE *GetMultipleComponentsInfo)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIdOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDs,
        SAFEARRAY **ppsaVarClassNames,
        SAFEARRAY **ppsaVarFileFlags,
        SAFEARRAY **ppsaVarComponentFlags);

    HRESULT (STDMETHODCALLTYPE *RefreshComponents)(
        ICOMAdminCatalog *This);

    HRESULT (STDMETHODCALLTYPE *BackupREGDB)(
        ICOMAdminCatalog *This,
        BSTR bstrBackupFilePath);

    HRESULT (STDMETHODCALLTYPE *RestoreREGDB)(
        ICOMAdminCatalog *This,
        BSTR bstrBackupFilePath);

    HRESULT (STDMETHODCALLTYPE *QueryApplicationFile)(
        ICOMAdminCatalog *This,
        BSTR bstrApplicationFile,
        BSTR *pbstrApplicationName,
        BSTR *pbstrApplicationDescription,
        VARIANT_BOOL *pbHasUsers,
        VARIANT_BOOL *pbIsProxy,
        SAFEARRAY **ppsaVarFileNames);

    HRESULT (STDMETHODCALLTYPE *StartApplication)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIdOrName);

    HRESULT (STDMETHODCALLTYPE *ServiceCheck)(
        ICOMAdminCatalog *This,
        LONG lService,
        LONG *plStatus);

    HRESULT (STDMETHODCALLTYPE *InstallMultipleEventClasses)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIdOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDS);

    HRESULT (STDMETHODCALLTYPE *InstallEventClass)(
        ICOMAdminCatalog *This,
        BSTR bstrApplIdOrName,
        BSTR bstrDLL,
        BSTR bstrTLB,
        BSTR bstrPSDLL);

    HRESULT (STDMETHODCALLTYPE *GetEventClassesForIID)(
        ICOMAdminCatalog *This,
        BSTR bstrIID,
        SAFEARRAY **ppsaVarCLSIDs,
        SAFEARRAY **ppsaVarProgIDs,
        SAFEARRAY **ppsaVarDescriptions);

    END_INTERFACE
} ICOMAdminCatalogVtbl;

interface ICOMAdminCatalog {
    CONST_VTBL ICOMAdminCatalogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICOMAdminCatalog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICOMAdminCatalog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICOMAdminCatalog_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICOMAdminCatalog_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICOMAdminCatalog_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICOMAdminCatalog_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICOMAdminCatalog_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICOMAdminCatalog methods ***/
#define ICOMAdminCatalog_GetCollection(This,bstrCollName,ppCatalogCollection) (This)->lpVtbl->GetCollection(This,bstrCollName,ppCatalogCollection)
#define ICOMAdminCatalog_Connect(This,bstrCatalogServerName,ppCatalogCollection) (This)->lpVtbl->Connect(This,bstrCatalogServerName,ppCatalogCollection)
#define ICOMAdminCatalog_get_MajorVersion(This,plMajorVersion) (This)->lpVtbl->get_MajorVersion(This,plMajorVersion)
#define ICOMAdminCatalog_get_MinorVersion(This,plMinorVersion) (This)->lpVtbl->get_MinorVersion(This,plMinorVersion)
#define ICOMAdminCatalog_GetCollectionByQuery(This,bstrCollName,ppsaVarQuery,ppCatalogCollection) (This)->lpVtbl->GetCollectionByQuery(This,bstrCollName,ppsaVarQuery,ppCatalogCollection)
#define ICOMAdminCatalog_ImportComponent(This,bstrApplIDOrName,bstrCLSIDOrProgID) (This)->lpVtbl->ImportComponent(This,bstrApplIDOrName,bstrCLSIDOrProgID)
#define ICOMAdminCatalog_InstallComponent(This,bstrApplIDOrName,bstrDLL,bstrTLB,bstrPSDLL) (This)->lpVtbl->InstallComponent(This,bstrApplIDOrName,bstrDLL,bstrTLB,bstrPSDLL)
#define ICOMAdminCatalog_ShutdownApplication(This,bstrApplIDOrName) (This)->lpVtbl->ShutdownApplication(This,bstrApplIDOrName)
#define ICOMAdminCatalog_ExportApplication(This,bstrApplIDOrName,bstrApplicationFile,lOptions) (This)->lpVtbl->ExportApplication(This,bstrApplIDOrName,bstrApplicationFile,lOptions)
#define ICOMAdminCatalog_InstallApplication(This,bstrApplicationFile,bstrDestinationDirectory,lOptions,bstrUserId,bstrPassword,bstrRSN) (This)->lpVtbl->InstallApplication(This,bstrApplicationFile,bstrDestinationDirectory,lOptions,bstrUserId,bstrPassword,bstrRSN)
#define ICOMAdminCatalog_StopRouter(This) (This)->lpVtbl->StopRouter(This)
#define ICOMAdminCatalog_RefreshRouter(This) (This)->lpVtbl->RefreshRouter(This)
#define ICOMAdminCatalog_StartRouter(This) (This)->lpVtbl->StartRouter(This)
#define ICOMAdminCatalog_Reserved1(This) (This)->lpVtbl->Reserved1(This)
#define ICOMAdminCatalog_Reserved2(This) (This)->lpVtbl->Reserved2(This)
#define ICOMAdminCatalog_InstallMultipleComponents(This,bstrApplIDOrName,ppsaVarFileNames,ppsaVarCLSIDs) (This)->lpVtbl->InstallMultipleComponents(This,bstrApplIDOrName,ppsaVarFileNames,ppsaVarCLSIDs)
#define ICOMAdminCatalog_GetMultipleComponentsInfo(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDs,ppsaVarClassNames,ppsaVarFileFlags,ppsaVarComponentFlags) (This)->lpVtbl->GetMultipleComponentsInfo(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDs,ppsaVarClassNames,ppsaVarFileFlags,ppsaVarComponentFlags)
#define ICOMAdminCatalog_RefreshComponents(This) (This)->lpVtbl->RefreshComponents(This)
#define ICOMAdminCatalog_BackupREGDB(This,bstrBackupFilePath) (This)->lpVtbl->BackupREGDB(This,bstrBackupFilePath)
#define ICOMAdminCatalog_RestoreREGDB(This,bstrBackupFilePath) (This)->lpVtbl->RestoreREGDB(This,bstrBackupFilePath)
#define ICOMAdminCatalog_QueryApplicationFile(This,bstrApplicationFile,pbstrApplicationName,pbstrApplicationDescription,pbHasUsers,pbIsProxy,ppsaVarFileNames) (This)->lpVtbl->QueryApplicationFile(This,bstrApplicationFile,pbstrApplicationName,pbstrApplicationDescription,pbHasUsers,pbIsProxy,ppsaVarFileNames)
#define ICOMAdminCatalog_StartApplication(This,bstrApplIdOrName) (This)->lpVtbl->StartApplication(This,bstrApplIdOrName)
#define ICOMAdminCatalog_ServiceCheck(This,lService,plStatus) (This)->lpVtbl->ServiceCheck(This,lService,plStatus)
#define ICOMAdminCatalog_InstallMultipleEventClasses(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDS) (This)->lpVtbl->InstallMultipleEventClasses(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDS)
#define ICOMAdminCatalog_InstallEventClass(This,bstrApplIdOrName,bstrDLL,bstrTLB,bstrPSDLL) (This)->lpVtbl->InstallEventClass(This,bstrApplIdOrName,bstrDLL,bstrTLB,bstrPSDLL)
#define ICOMAdminCatalog_GetEventClassesForIID(This,bstrIID,ppsaVarCLSIDs,ppsaVarProgIDs,ppsaVarDescriptions) (This)->lpVtbl->GetEventClassesForIID(This,bstrIID,ppsaVarCLSIDs,ppsaVarProgIDs,ppsaVarDescriptions)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICOMAdminCatalog_QueryInterface(ICOMAdminCatalog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICOMAdminCatalog_AddRef(ICOMAdminCatalog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICOMAdminCatalog_Release(ICOMAdminCatalog* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICOMAdminCatalog_GetTypeInfoCount(ICOMAdminCatalog* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_GetTypeInfo(ICOMAdminCatalog* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_GetIDsOfNames(ICOMAdminCatalog* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_Invoke(ICOMAdminCatalog* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ICOMAdminCatalog methods ***/
static FORCEINLINE HRESULT ICOMAdminCatalog_GetCollection(ICOMAdminCatalog* This,BSTR bstrCollName,IDispatch **ppCatalogCollection) {
    return This->lpVtbl->GetCollection(This,bstrCollName,ppCatalogCollection);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_Connect(ICOMAdminCatalog* This,BSTR bstrCatalogServerName,IDispatch **ppCatalogCollection) {
    return This->lpVtbl->Connect(This,bstrCatalogServerName,ppCatalogCollection);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_get_MajorVersion(ICOMAdminCatalog* This,LONG *plMajorVersion) {
    return This->lpVtbl->get_MajorVersion(This,plMajorVersion);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_get_MinorVersion(ICOMAdminCatalog* This,LONG *plMinorVersion) {
    return This->lpVtbl->get_MinorVersion(This,plMinorVersion);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_GetCollectionByQuery(ICOMAdminCatalog* This,BSTR bstrCollName,SAFEARRAY **ppsaVarQuery,IDispatch **ppCatalogCollection) {
    return This->lpVtbl->GetCollectionByQuery(This,bstrCollName,ppsaVarQuery,ppCatalogCollection);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_ImportComponent(ICOMAdminCatalog* This,BSTR bstrApplIDOrName,BSTR bstrCLSIDOrProgID) {
    return This->lpVtbl->ImportComponent(This,bstrApplIDOrName,bstrCLSIDOrProgID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_InstallComponent(ICOMAdminCatalog* This,BSTR bstrApplIDOrName,BSTR bstrDLL,BSTR bstrTLB,BSTR bstrPSDLL) {
    return This->lpVtbl->InstallComponent(This,bstrApplIDOrName,bstrDLL,bstrTLB,bstrPSDLL);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_ShutdownApplication(ICOMAdminCatalog* This,BSTR bstrApplIDOrName) {
    return This->lpVtbl->ShutdownApplication(This,bstrApplIDOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_ExportApplication(ICOMAdminCatalog* This,BSTR bstrApplIDOrName,BSTR bstrApplicationFile,LONG lOptions) {
    return This->lpVtbl->ExportApplication(This,bstrApplIDOrName,bstrApplicationFile,lOptions);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_InstallApplication(ICOMAdminCatalog* This,BSTR bstrApplicationFile,BSTR bstrDestinationDirectory,LONG lOptions,BSTR bstrUserId,BSTR bstrPassword,BSTR bstrRSN) {
    return This->lpVtbl->InstallApplication(This,bstrApplicationFile,bstrDestinationDirectory,lOptions,bstrUserId,bstrPassword,bstrRSN);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_StopRouter(ICOMAdminCatalog* This) {
    return This->lpVtbl->StopRouter(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_RefreshRouter(ICOMAdminCatalog* This) {
    return This->lpVtbl->RefreshRouter(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_StartRouter(ICOMAdminCatalog* This) {
    return This->lpVtbl->StartRouter(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_Reserved1(ICOMAdminCatalog* This) {
    return This->lpVtbl->Reserved1(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_Reserved2(ICOMAdminCatalog* This) {
    return This->lpVtbl->Reserved2(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_InstallMultipleComponents(ICOMAdminCatalog* This,BSTR bstrApplIDOrName,SAFEARRAY **ppsaVarFileNames,SAFEARRAY **ppsaVarCLSIDs) {
    return This->lpVtbl->InstallMultipleComponents(This,bstrApplIDOrName,ppsaVarFileNames,ppsaVarCLSIDs);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_GetMultipleComponentsInfo(ICOMAdminCatalog* This,BSTR bstrApplIdOrName,SAFEARRAY **ppsaVarFileNames,SAFEARRAY **ppsaVarCLSIDs,SAFEARRAY **ppsaVarClassNames,SAFEARRAY **ppsaVarFileFlags,SAFEARRAY **ppsaVarComponentFlags) {
    return This->lpVtbl->GetMultipleComponentsInfo(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDs,ppsaVarClassNames,ppsaVarFileFlags,ppsaVarComponentFlags);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_RefreshComponents(ICOMAdminCatalog* This) {
    return This->lpVtbl->RefreshComponents(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_BackupREGDB(ICOMAdminCatalog* This,BSTR bstrBackupFilePath) {
    return This->lpVtbl->BackupREGDB(This,bstrBackupFilePath);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_RestoreREGDB(ICOMAdminCatalog* This,BSTR bstrBackupFilePath) {
    return This->lpVtbl->RestoreREGDB(This,bstrBackupFilePath);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_QueryApplicationFile(ICOMAdminCatalog* This,BSTR bstrApplicationFile,BSTR *pbstrApplicationName,BSTR *pbstrApplicationDescription,VARIANT_BOOL *pbHasUsers,VARIANT_BOOL *pbIsProxy,SAFEARRAY **ppsaVarFileNames) {
    return This->lpVtbl->QueryApplicationFile(This,bstrApplicationFile,pbstrApplicationName,pbstrApplicationDescription,pbHasUsers,pbIsProxy,ppsaVarFileNames);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_StartApplication(ICOMAdminCatalog* This,BSTR bstrApplIdOrName) {
    return This->lpVtbl->StartApplication(This,bstrApplIdOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_ServiceCheck(ICOMAdminCatalog* This,LONG lService,LONG *plStatus) {
    return This->lpVtbl->ServiceCheck(This,lService,plStatus);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_InstallMultipleEventClasses(ICOMAdminCatalog* This,BSTR bstrApplIdOrName,SAFEARRAY **ppsaVarFileNames,SAFEARRAY **ppsaVarCLSIDS) {
    return This->lpVtbl->InstallMultipleEventClasses(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDS);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_InstallEventClass(ICOMAdminCatalog* This,BSTR bstrApplIdOrName,BSTR bstrDLL,BSTR bstrTLB,BSTR bstrPSDLL) {
    return This->lpVtbl->InstallEventClass(This,bstrApplIdOrName,bstrDLL,bstrTLB,bstrPSDLL);
}
static FORCEINLINE HRESULT ICOMAdminCatalog_GetEventClassesForIID(ICOMAdminCatalog* This,BSTR bstrIID,SAFEARRAY **ppsaVarCLSIDs,SAFEARRAY **ppsaVarProgIDs,SAFEARRAY **ppsaVarDescriptions) {
    return This->lpVtbl->GetEventClassesForIID(This,bstrIID,ppsaVarCLSIDs,ppsaVarProgIDs,ppsaVarDescriptions);
}
#endif
#endif

#endif


#endif  /* __ICOMAdminCatalog_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICOMAdminCatalog2 interface
 */
#ifndef __ICOMAdminCatalog2_INTERFACE_DEFINED__
#define __ICOMAdminCatalog2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICOMAdminCatalog2, 0x790c6e0b, 0x9194, 0x4cc9, 0x94,0x26, 0xa4,0x8a,0x63,0x18,0x56,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("790c6e0b-9194-4cc9-9426-a48a63185696")
ICOMAdminCatalog2 : public ICOMAdminCatalog
{
    virtual HRESULT STDMETHODCALLTYPE GetCollectionByQuery2(
        BSTR bstrCollectionName,
        VARIANT *pVarQueryStrings,
        IDispatch **ppCatalogCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetApplicationInstanceIDFromProcessID(
        LONG lProcessID,
        BSTR *pbstrApplicationInstanceID) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShutdownApplicationInstances(
        VARIANT *pVarApplicationInstanceID) = 0;

    virtual HRESULT STDMETHODCALLTYPE PauseApplicationInstances(
        VARIANT *pVarApplicationInstanceID) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResumeApplicationInstances(
        VARIANT *pVarApplicationInstanceID) = 0;

    virtual HRESULT STDMETHODCALLTYPE RecycleApplicationInstances(
        VARIANT *pVarApplicationInstanceID,
        LONG lReasonCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE AreApplicationInstancesPaused(
        VARIANT *pVarApplicationInstanceID,
        VARIANT_BOOL *pVarBoolPaused) = 0;

    virtual HRESULT STDMETHODCALLTYPE DumpApplicationInstance(
        BSTR bstrApplicationInstanceID,
        BSTR bstrDirectory,
        LONG lMaxImages,
        BSTR *pbstrDumpFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsApplicationInstanceDumpSupported(
        VARIANT_BOOL *pVarBoolDumpSupported) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateServiceForApplication(
        BSTR bstrApplicationIDOrName,
        BSTR bstrServiceName,
        BSTR bstrStartType,
        BSTR bstrErrorControl,
        BSTR bstrDependencies,
        BSTR bstrRunAs,
        BSTR bstrPassword,
        VARIANT_BOOL bDesktopOk) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteServiceForApplication(
        BSTR bstrApplicationIDOrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPartitionID(
        BSTR bstrApplicationIDOrName,
        BSTR *pbstrPartitionID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPartitionName(
        BSTR bstrApplicationIDOrName,
        BSTR *pbstrPartitionName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CurrentPartition(
        BSTR bstrPartitionIDOrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentPartitionID(
        BSTR *pbstrPartitionID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentPartitionName(
        BSTR *pbstrPartitionName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_GlobalPartitionID(
        BSTR *pbstrGlobalPartitionID) = 0;

    virtual HRESULT STDMETHODCALLTYPE FlushPartitionCache(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyApplications(
        BSTR bstrSourcePartitionIDOrName,
        VARIANT *pVarApplicationID,
        BSTR bstrDestinationPartitionIDOrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyComponents(
        BSTR bstrSourceApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        BSTR bstrDestinationApplicationIDOrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveComponents(
        BSTR bstrSourceApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        BSTR bstrDestinationApplicationIDOrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE AliasComponent(
        BSTR bstrSrcApplicationIDOrName,
        BSTR bstrCLSIDOrProgID,
        BSTR bstrDestApplicationIDOrName,
        BSTR bstrNewProgId,
        BSTR bstrNewClsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSafeToDelete(
        BSTR bstrDllName,
        COMAdminInUse *pCOMAdminInUse) = 0;

    virtual HRESULT STDMETHODCALLTYPE ImportUnconfiguredComponents(
        BSTR bstrApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        VARIANT *pVarComponentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE PromoteUnconfiguredComponents(
        BSTR bstrApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        VARIANT *pVarComponentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE ImportComponents(
        BSTR bstrApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        VARIANT *pVarComponentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Is64BitCatalogServer(
        VARIANT_BOOL *pbIs64Bit) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExportPartition(
        BSTR bstrPartitionIDOrName,
        BSTR bstrPartitionFileName,
        LONG lOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstallPartition(
        BSTR bstrFileName,
        BSTR bstrDestDirectory,
        LONG lOptions,
        BSTR bstrUserID,
        BSTR bstrPassword,
        BSTR bstrRSN) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryApplicationFile2(
        BSTR bstrApplicationFile,
        IDispatch **ppFilesForImport) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetComponentVersionCount(
        BSTR bstrCLSIDOrProgID,
        LONG *plVersionCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICOMAdminCatalog2, 0x790c6e0b, 0x9194, 0x4cc9, 0x94,0x26, 0xa4,0x8a,0x63,0x18,0x56,0x96)
#endif
#else
typedef struct ICOMAdminCatalog2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICOMAdminCatalog2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICOMAdminCatalog2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICOMAdminCatalog2 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICOMAdminCatalog2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICOMAdminCatalog2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICOMAdminCatalog2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICOMAdminCatalog2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICOMAdminCatalog methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCollection)(
        ICOMAdminCatalog2 *This,
        BSTR bstrCollName,
        IDispatch **ppCatalogCollection);

    HRESULT (STDMETHODCALLTYPE *Connect)(
        ICOMAdminCatalog2 *This,
        BSTR bstrCatalogServerName,
        IDispatch **ppCatalogCollection);

    HRESULT (STDMETHODCALLTYPE *get_MajorVersion)(
        ICOMAdminCatalog2 *This,
        LONG *plMajorVersion);

    HRESULT (STDMETHODCALLTYPE *get_MinorVersion)(
        ICOMAdminCatalog2 *This,
        LONG *plMinorVersion);

    HRESULT (STDMETHODCALLTYPE *GetCollectionByQuery)(
        ICOMAdminCatalog2 *This,
        BSTR bstrCollName,
        SAFEARRAY **ppsaVarQuery,
        IDispatch **ppCatalogCollection);

    HRESULT (STDMETHODCALLTYPE *ImportComponent)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIDOrName,
        BSTR bstrCLSIDOrProgID);

    HRESULT (STDMETHODCALLTYPE *InstallComponent)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIDOrName,
        BSTR bstrDLL,
        BSTR bstrTLB,
        BSTR bstrPSDLL);

    HRESULT (STDMETHODCALLTYPE *ShutdownApplication)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIDOrName);

    HRESULT (STDMETHODCALLTYPE *ExportApplication)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIDOrName,
        BSTR bstrApplicationFile,
        LONG lOptions);

    HRESULT (STDMETHODCALLTYPE *InstallApplication)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationFile,
        BSTR bstrDestinationDirectory,
        LONG lOptions,
        BSTR bstrUserId,
        BSTR bstrPassword,
        BSTR bstrRSN);

    HRESULT (STDMETHODCALLTYPE *StopRouter)(
        ICOMAdminCatalog2 *This);

    HRESULT (STDMETHODCALLTYPE *RefreshRouter)(
        ICOMAdminCatalog2 *This);

    HRESULT (STDMETHODCALLTYPE *StartRouter)(
        ICOMAdminCatalog2 *This);

    HRESULT (STDMETHODCALLTYPE *Reserved1)(
        ICOMAdminCatalog2 *This);

    HRESULT (STDMETHODCALLTYPE *Reserved2)(
        ICOMAdminCatalog2 *This);

    HRESULT (STDMETHODCALLTYPE *InstallMultipleComponents)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIDOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDs);

    HRESULT (STDMETHODCALLTYPE *GetMultipleComponentsInfo)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIdOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDs,
        SAFEARRAY **ppsaVarClassNames,
        SAFEARRAY **ppsaVarFileFlags,
        SAFEARRAY **ppsaVarComponentFlags);

    HRESULT (STDMETHODCALLTYPE *RefreshComponents)(
        ICOMAdminCatalog2 *This);

    HRESULT (STDMETHODCALLTYPE *BackupREGDB)(
        ICOMAdminCatalog2 *This,
        BSTR bstrBackupFilePath);

    HRESULT (STDMETHODCALLTYPE *RestoreREGDB)(
        ICOMAdminCatalog2 *This,
        BSTR bstrBackupFilePath);

    HRESULT (STDMETHODCALLTYPE *QueryApplicationFile)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationFile,
        BSTR *pbstrApplicationName,
        BSTR *pbstrApplicationDescription,
        VARIANT_BOOL *pbHasUsers,
        VARIANT_BOOL *pbIsProxy,
        SAFEARRAY **ppsaVarFileNames);

    HRESULT (STDMETHODCALLTYPE *StartApplication)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIdOrName);

    HRESULT (STDMETHODCALLTYPE *ServiceCheck)(
        ICOMAdminCatalog2 *This,
        LONG lService,
        LONG *plStatus);

    HRESULT (STDMETHODCALLTYPE *InstallMultipleEventClasses)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIdOrName,
        SAFEARRAY **ppsaVarFileNames,
        SAFEARRAY **ppsaVarCLSIDS);

    HRESULT (STDMETHODCALLTYPE *InstallEventClass)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplIdOrName,
        BSTR bstrDLL,
        BSTR bstrTLB,
        BSTR bstrPSDLL);

    HRESULT (STDMETHODCALLTYPE *GetEventClassesForIID)(
        ICOMAdminCatalog2 *This,
        BSTR bstrIID,
        SAFEARRAY **ppsaVarCLSIDs,
        SAFEARRAY **ppsaVarProgIDs,
        SAFEARRAY **ppsaVarDescriptions);

    /*** ICOMAdminCatalog2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCollectionByQuery2)(
        ICOMAdminCatalog2 *This,
        BSTR bstrCollectionName,
        VARIANT *pVarQueryStrings,
        IDispatch **ppCatalogCollection);

    HRESULT (STDMETHODCALLTYPE *GetApplicationInstanceIDFromProcessID)(
        ICOMAdminCatalog2 *This,
        LONG lProcessID,
        BSTR *pbstrApplicationInstanceID);

    HRESULT (STDMETHODCALLTYPE *ShutdownApplicationInstances)(
        ICOMAdminCatalog2 *This,
        VARIANT *pVarApplicationInstanceID);

    HRESULT (STDMETHODCALLTYPE *PauseApplicationInstances)(
        ICOMAdminCatalog2 *This,
        VARIANT *pVarApplicationInstanceID);

    HRESULT (STDMETHODCALLTYPE *ResumeApplicationInstances)(
        ICOMAdminCatalog2 *This,
        VARIANT *pVarApplicationInstanceID);

    HRESULT (STDMETHODCALLTYPE *RecycleApplicationInstances)(
        ICOMAdminCatalog2 *This,
        VARIANT *pVarApplicationInstanceID,
        LONG lReasonCode);

    HRESULT (STDMETHODCALLTYPE *AreApplicationInstancesPaused)(
        ICOMAdminCatalog2 *This,
        VARIANT *pVarApplicationInstanceID,
        VARIANT_BOOL *pVarBoolPaused);

    HRESULT (STDMETHODCALLTYPE *DumpApplicationInstance)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationInstanceID,
        BSTR bstrDirectory,
        LONG lMaxImages,
        BSTR *pbstrDumpFile);

    HRESULT (STDMETHODCALLTYPE *get_IsApplicationInstanceDumpSupported)(
        ICOMAdminCatalog2 *This,
        VARIANT_BOOL *pVarBoolDumpSupported);

    HRESULT (STDMETHODCALLTYPE *CreateServiceForApplication)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationIDOrName,
        BSTR bstrServiceName,
        BSTR bstrStartType,
        BSTR bstrErrorControl,
        BSTR bstrDependencies,
        BSTR bstrRunAs,
        BSTR bstrPassword,
        VARIANT_BOOL bDesktopOk);

    HRESULT (STDMETHODCALLTYPE *DeleteServiceForApplication)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationIDOrName);

    HRESULT (STDMETHODCALLTYPE *GetPartitionID)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationIDOrName,
        BSTR *pbstrPartitionID);

    HRESULT (STDMETHODCALLTYPE *GetPartitionName)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationIDOrName,
        BSTR *pbstrPartitionName);

    HRESULT (STDMETHODCALLTYPE *put_CurrentPartition)(
        ICOMAdminCatalog2 *This,
        BSTR bstrPartitionIDOrName);

    HRESULT (STDMETHODCALLTYPE *get_CurrentPartitionID)(
        ICOMAdminCatalog2 *This,
        BSTR *pbstrPartitionID);

    HRESULT (STDMETHODCALLTYPE *get_CurrentPartitionName)(
        ICOMAdminCatalog2 *This,
        BSTR *pbstrPartitionName);

    HRESULT (STDMETHODCALLTYPE *get_GlobalPartitionID)(
        ICOMAdminCatalog2 *This,
        BSTR *pbstrGlobalPartitionID);

    HRESULT (STDMETHODCALLTYPE *FlushPartitionCache)(
        ICOMAdminCatalog2 *This);

    HRESULT (STDMETHODCALLTYPE *CopyApplications)(
        ICOMAdminCatalog2 *This,
        BSTR bstrSourcePartitionIDOrName,
        VARIANT *pVarApplicationID,
        BSTR bstrDestinationPartitionIDOrName);

    HRESULT (STDMETHODCALLTYPE *CopyComponents)(
        ICOMAdminCatalog2 *This,
        BSTR bstrSourceApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        BSTR bstrDestinationApplicationIDOrName);

    HRESULT (STDMETHODCALLTYPE *MoveComponents)(
        ICOMAdminCatalog2 *This,
        BSTR bstrSourceApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        BSTR bstrDestinationApplicationIDOrName);

    HRESULT (STDMETHODCALLTYPE *AliasComponent)(
        ICOMAdminCatalog2 *This,
        BSTR bstrSrcApplicationIDOrName,
        BSTR bstrCLSIDOrProgID,
        BSTR bstrDestApplicationIDOrName,
        BSTR bstrNewProgId,
        BSTR bstrNewClsid);

    HRESULT (STDMETHODCALLTYPE *IsSafeToDelete)(
        ICOMAdminCatalog2 *This,
        BSTR bstrDllName,
        COMAdminInUse *pCOMAdminInUse);

    HRESULT (STDMETHODCALLTYPE *ImportUnconfiguredComponents)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        VARIANT *pVarComponentType);

    HRESULT (STDMETHODCALLTYPE *PromoteUnconfiguredComponents)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        VARIANT *pVarComponentType);

    HRESULT (STDMETHODCALLTYPE *ImportComponents)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationIDOrName,
        VARIANT *pVarCLSIDOrProgID,
        VARIANT *pVarComponentType);

    HRESULT (STDMETHODCALLTYPE *get_Is64BitCatalogServer)(
        ICOMAdminCatalog2 *This,
        VARIANT_BOOL *pbIs64Bit);

    HRESULT (STDMETHODCALLTYPE *ExportPartition)(
        ICOMAdminCatalog2 *This,
        BSTR bstrPartitionIDOrName,
        BSTR bstrPartitionFileName,
        LONG lOptions);

    HRESULT (STDMETHODCALLTYPE *InstallPartition)(
        ICOMAdminCatalog2 *This,
        BSTR bstrFileName,
        BSTR bstrDestDirectory,
        LONG lOptions,
        BSTR bstrUserID,
        BSTR bstrPassword,
        BSTR bstrRSN);

    HRESULT (STDMETHODCALLTYPE *QueryApplicationFile2)(
        ICOMAdminCatalog2 *This,
        BSTR bstrApplicationFile,
        IDispatch **ppFilesForImport);

    HRESULT (STDMETHODCALLTYPE *GetComponentVersionCount)(
        ICOMAdminCatalog2 *This,
        BSTR bstrCLSIDOrProgID,
        LONG *plVersionCount);

    END_INTERFACE
} ICOMAdminCatalog2Vtbl;

interface ICOMAdminCatalog2 {
    CONST_VTBL ICOMAdminCatalog2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICOMAdminCatalog2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICOMAdminCatalog2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICOMAdminCatalog2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICOMAdminCatalog2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICOMAdminCatalog2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICOMAdminCatalog2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICOMAdminCatalog2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICOMAdminCatalog methods ***/
#define ICOMAdminCatalog2_GetCollection(This,bstrCollName,ppCatalogCollection) (This)->lpVtbl->GetCollection(This,bstrCollName,ppCatalogCollection)
#define ICOMAdminCatalog2_Connect(This,bstrCatalogServerName,ppCatalogCollection) (This)->lpVtbl->Connect(This,bstrCatalogServerName,ppCatalogCollection)
#define ICOMAdminCatalog2_get_MajorVersion(This,plMajorVersion) (This)->lpVtbl->get_MajorVersion(This,plMajorVersion)
#define ICOMAdminCatalog2_get_MinorVersion(This,plMinorVersion) (This)->lpVtbl->get_MinorVersion(This,plMinorVersion)
#define ICOMAdminCatalog2_GetCollectionByQuery(This,bstrCollName,ppsaVarQuery,ppCatalogCollection) (This)->lpVtbl->GetCollectionByQuery(This,bstrCollName,ppsaVarQuery,ppCatalogCollection)
#define ICOMAdminCatalog2_ImportComponent(This,bstrApplIDOrName,bstrCLSIDOrProgID) (This)->lpVtbl->ImportComponent(This,bstrApplIDOrName,bstrCLSIDOrProgID)
#define ICOMAdminCatalog2_InstallComponent(This,bstrApplIDOrName,bstrDLL,bstrTLB,bstrPSDLL) (This)->lpVtbl->InstallComponent(This,bstrApplIDOrName,bstrDLL,bstrTLB,bstrPSDLL)
#define ICOMAdminCatalog2_ShutdownApplication(This,bstrApplIDOrName) (This)->lpVtbl->ShutdownApplication(This,bstrApplIDOrName)
#define ICOMAdminCatalog2_ExportApplication(This,bstrApplIDOrName,bstrApplicationFile,lOptions) (This)->lpVtbl->ExportApplication(This,bstrApplIDOrName,bstrApplicationFile,lOptions)
#define ICOMAdminCatalog2_InstallApplication(This,bstrApplicationFile,bstrDestinationDirectory,lOptions,bstrUserId,bstrPassword,bstrRSN) (This)->lpVtbl->InstallApplication(This,bstrApplicationFile,bstrDestinationDirectory,lOptions,bstrUserId,bstrPassword,bstrRSN)
#define ICOMAdminCatalog2_StopRouter(This) (This)->lpVtbl->StopRouter(This)
#define ICOMAdminCatalog2_RefreshRouter(This) (This)->lpVtbl->RefreshRouter(This)
#define ICOMAdminCatalog2_StartRouter(This) (This)->lpVtbl->StartRouter(This)
#define ICOMAdminCatalog2_Reserved1(This) (This)->lpVtbl->Reserved1(This)
#define ICOMAdminCatalog2_Reserved2(This) (This)->lpVtbl->Reserved2(This)
#define ICOMAdminCatalog2_InstallMultipleComponents(This,bstrApplIDOrName,ppsaVarFileNames,ppsaVarCLSIDs) (This)->lpVtbl->InstallMultipleComponents(This,bstrApplIDOrName,ppsaVarFileNames,ppsaVarCLSIDs)
#define ICOMAdminCatalog2_GetMultipleComponentsInfo(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDs,ppsaVarClassNames,ppsaVarFileFlags,ppsaVarComponentFlags) (This)->lpVtbl->GetMultipleComponentsInfo(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDs,ppsaVarClassNames,ppsaVarFileFlags,ppsaVarComponentFlags)
#define ICOMAdminCatalog2_RefreshComponents(This) (This)->lpVtbl->RefreshComponents(This)
#define ICOMAdminCatalog2_BackupREGDB(This,bstrBackupFilePath) (This)->lpVtbl->BackupREGDB(This,bstrBackupFilePath)
#define ICOMAdminCatalog2_RestoreREGDB(This,bstrBackupFilePath) (This)->lpVtbl->RestoreREGDB(This,bstrBackupFilePath)
#define ICOMAdminCatalog2_QueryApplicationFile(This,bstrApplicationFile,pbstrApplicationName,pbstrApplicationDescription,pbHasUsers,pbIsProxy,ppsaVarFileNames) (This)->lpVtbl->QueryApplicationFile(This,bstrApplicationFile,pbstrApplicationName,pbstrApplicationDescription,pbHasUsers,pbIsProxy,ppsaVarFileNames)
#define ICOMAdminCatalog2_StartApplication(This,bstrApplIdOrName) (This)->lpVtbl->StartApplication(This,bstrApplIdOrName)
#define ICOMAdminCatalog2_ServiceCheck(This,lService,plStatus) (This)->lpVtbl->ServiceCheck(This,lService,plStatus)
#define ICOMAdminCatalog2_InstallMultipleEventClasses(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDS) (This)->lpVtbl->InstallMultipleEventClasses(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDS)
#define ICOMAdminCatalog2_InstallEventClass(This,bstrApplIdOrName,bstrDLL,bstrTLB,bstrPSDLL) (This)->lpVtbl->InstallEventClass(This,bstrApplIdOrName,bstrDLL,bstrTLB,bstrPSDLL)
#define ICOMAdminCatalog2_GetEventClassesForIID(This,bstrIID,ppsaVarCLSIDs,ppsaVarProgIDs,ppsaVarDescriptions) (This)->lpVtbl->GetEventClassesForIID(This,bstrIID,ppsaVarCLSIDs,ppsaVarProgIDs,ppsaVarDescriptions)
/*** ICOMAdminCatalog2 methods ***/
#define ICOMAdminCatalog2_GetCollectionByQuery2(This,bstrCollectionName,pVarQueryStrings,ppCatalogCollection) (This)->lpVtbl->GetCollectionByQuery2(This,bstrCollectionName,pVarQueryStrings,ppCatalogCollection)
#define ICOMAdminCatalog2_GetApplicationInstanceIDFromProcessID(This,lProcessID,pbstrApplicationInstanceID) (This)->lpVtbl->GetApplicationInstanceIDFromProcessID(This,lProcessID,pbstrApplicationInstanceID)
#define ICOMAdminCatalog2_ShutdownApplicationInstances(This,pVarApplicationInstanceID) (This)->lpVtbl->ShutdownApplicationInstances(This,pVarApplicationInstanceID)
#define ICOMAdminCatalog2_PauseApplicationInstances(This,pVarApplicationInstanceID) (This)->lpVtbl->PauseApplicationInstances(This,pVarApplicationInstanceID)
#define ICOMAdminCatalog2_ResumeApplicationInstances(This,pVarApplicationInstanceID) (This)->lpVtbl->ResumeApplicationInstances(This,pVarApplicationInstanceID)
#define ICOMAdminCatalog2_RecycleApplicationInstances(This,pVarApplicationInstanceID,lReasonCode) (This)->lpVtbl->RecycleApplicationInstances(This,pVarApplicationInstanceID,lReasonCode)
#define ICOMAdminCatalog2_AreApplicationInstancesPaused(This,pVarApplicationInstanceID,pVarBoolPaused) (This)->lpVtbl->AreApplicationInstancesPaused(This,pVarApplicationInstanceID,pVarBoolPaused)
#define ICOMAdminCatalog2_DumpApplicationInstance(This,bstrApplicationInstanceID,bstrDirectory,lMaxImages,pbstrDumpFile) (This)->lpVtbl->DumpApplicationInstance(This,bstrApplicationInstanceID,bstrDirectory,lMaxImages,pbstrDumpFile)
#define ICOMAdminCatalog2_get_IsApplicationInstanceDumpSupported(This,pVarBoolDumpSupported) (This)->lpVtbl->get_IsApplicationInstanceDumpSupported(This,pVarBoolDumpSupported)
#define ICOMAdminCatalog2_CreateServiceForApplication(This,bstrApplicationIDOrName,bstrServiceName,bstrStartType,bstrErrorControl,bstrDependencies,bstrRunAs,bstrPassword,bDesktopOk) (This)->lpVtbl->CreateServiceForApplication(This,bstrApplicationIDOrName,bstrServiceName,bstrStartType,bstrErrorControl,bstrDependencies,bstrRunAs,bstrPassword,bDesktopOk)
#define ICOMAdminCatalog2_DeleteServiceForApplication(This,bstrApplicationIDOrName) (This)->lpVtbl->DeleteServiceForApplication(This,bstrApplicationIDOrName)
#define ICOMAdminCatalog2_GetPartitionID(This,bstrApplicationIDOrName,pbstrPartitionID) (This)->lpVtbl->GetPartitionID(This,bstrApplicationIDOrName,pbstrPartitionID)
#define ICOMAdminCatalog2_GetPartitionName(This,bstrApplicationIDOrName,pbstrPartitionName) (This)->lpVtbl->GetPartitionName(This,bstrApplicationIDOrName,pbstrPartitionName)
#define ICOMAdminCatalog2_put_CurrentPartition(This,bstrPartitionIDOrName) (This)->lpVtbl->put_CurrentPartition(This,bstrPartitionIDOrName)
#define ICOMAdminCatalog2_get_CurrentPartitionID(This,pbstrPartitionID) (This)->lpVtbl->get_CurrentPartitionID(This,pbstrPartitionID)
#define ICOMAdminCatalog2_get_CurrentPartitionName(This,pbstrPartitionName) (This)->lpVtbl->get_CurrentPartitionName(This,pbstrPartitionName)
#define ICOMAdminCatalog2_get_GlobalPartitionID(This,pbstrGlobalPartitionID) (This)->lpVtbl->get_GlobalPartitionID(This,pbstrGlobalPartitionID)
#define ICOMAdminCatalog2_FlushPartitionCache(This) (This)->lpVtbl->FlushPartitionCache(This)
#define ICOMAdminCatalog2_CopyApplications(This,bstrSourcePartitionIDOrName,pVarApplicationID,bstrDestinationPartitionIDOrName) (This)->lpVtbl->CopyApplications(This,bstrSourcePartitionIDOrName,pVarApplicationID,bstrDestinationPartitionIDOrName)
#define ICOMAdminCatalog2_CopyComponents(This,bstrSourceApplicationIDOrName,pVarCLSIDOrProgID,bstrDestinationApplicationIDOrName) (This)->lpVtbl->CopyComponents(This,bstrSourceApplicationIDOrName,pVarCLSIDOrProgID,bstrDestinationApplicationIDOrName)
#define ICOMAdminCatalog2_MoveComponents(This,bstrSourceApplicationIDOrName,pVarCLSIDOrProgID,bstrDestinationApplicationIDOrName) (This)->lpVtbl->MoveComponents(This,bstrSourceApplicationIDOrName,pVarCLSIDOrProgID,bstrDestinationApplicationIDOrName)
#define ICOMAdminCatalog2_AliasComponent(This,bstrSrcApplicationIDOrName,bstrCLSIDOrProgID,bstrDestApplicationIDOrName,bstrNewProgId,bstrNewClsid) (This)->lpVtbl->AliasComponent(This,bstrSrcApplicationIDOrName,bstrCLSIDOrProgID,bstrDestApplicationIDOrName,bstrNewProgId,bstrNewClsid)
#define ICOMAdminCatalog2_IsSafeToDelete(This,bstrDllName,pCOMAdminInUse) (This)->lpVtbl->IsSafeToDelete(This,bstrDllName,pCOMAdminInUse)
#define ICOMAdminCatalog2_ImportUnconfiguredComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType) (This)->lpVtbl->ImportUnconfiguredComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType)
#define ICOMAdminCatalog2_PromoteUnconfiguredComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType) (This)->lpVtbl->PromoteUnconfiguredComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType)
#define ICOMAdminCatalog2_ImportComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType) (This)->lpVtbl->ImportComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType)
#define ICOMAdminCatalog2_get_Is64BitCatalogServer(This,pbIs64Bit) (This)->lpVtbl->get_Is64BitCatalogServer(This,pbIs64Bit)
#define ICOMAdminCatalog2_ExportPartition(This,bstrPartitionIDOrName,bstrPartitionFileName,lOptions) (This)->lpVtbl->ExportPartition(This,bstrPartitionIDOrName,bstrPartitionFileName,lOptions)
#define ICOMAdminCatalog2_InstallPartition(This,bstrFileName,bstrDestDirectory,lOptions,bstrUserID,bstrPassword,bstrRSN) (This)->lpVtbl->InstallPartition(This,bstrFileName,bstrDestDirectory,lOptions,bstrUserID,bstrPassword,bstrRSN)
#define ICOMAdminCatalog2_QueryApplicationFile2(This,bstrApplicationFile,ppFilesForImport) (This)->lpVtbl->QueryApplicationFile2(This,bstrApplicationFile,ppFilesForImport)
#define ICOMAdminCatalog2_GetComponentVersionCount(This,bstrCLSIDOrProgID,plVersionCount) (This)->lpVtbl->GetComponentVersionCount(This,bstrCLSIDOrProgID,plVersionCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICOMAdminCatalog2_QueryInterface(ICOMAdminCatalog2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICOMAdminCatalog2_AddRef(ICOMAdminCatalog2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICOMAdminCatalog2_Release(ICOMAdminCatalog2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetTypeInfoCount(ICOMAdminCatalog2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetTypeInfo(ICOMAdminCatalog2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetIDsOfNames(ICOMAdminCatalog2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_Invoke(ICOMAdminCatalog2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ICOMAdminCatalog methods ***/
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetCollection(ICOMAdminCatalog2* This,BSTR bstrCollName,IDispatch **ppCatalogCollection) {
    return This->lpVtbl->GetCollection(This,bstrCollName,ppCatalogCollection);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_Connect(ICOMAdminCatalog2* This,BSTR bstrCatalogServerName,IDispatch **ppCatalogCollection) {
    return This->lpVtbl->Connect(This,bstrCatalogServerName,ppCatalogCollection);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_get_MajorVersion(ICOMAdminCatalog2* This,LONG *plMajorVersion) {
    return This->lpVtbl->get_MajorVersion(This,plMajorVersion);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_get_MinorVersion(ICOMAdminCatalog2* This,LONG *plMinorVersion) {
    return This->lpVtbl->get_MinorVersion(This,plMinorVersion);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetCollectionByQuery(ICOMAdminCatalog2* This,BSTR bstrCollName,SAFEARRAY **ppsaVarQuery,IDispatch **ppCatalogCollection) {
    return This->lpVtbl->GetCollectionByQuery(This,bstrCollName,ppsaVarQuery,ppCatalogCollection);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ImportComponent(ICOMAdminCatalog2* This,BSTR bstrApplIDOrName,BSTR bstrCLSIDOrProgID) {
    return This->lpVtbl->ImportComponent(This,bstrApplIDOrName,bstrCLSIDOrProgID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_InstallComponent(ICOMAdminCatalog2* This,BSTR bstrApplIDOrName,BSTR bstrDLL,BSTR bstrTLB,BSTR bstrPSDLL) {
    return This->lpVtbl->InstallComponent(This,bstrApplIDOrName,bstrDLL,bstrTLB,bstrPSDLL);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ShutdownApplication(ICOMAdminCatalog2* This,BSTR bstrApplIDOrName) {
    return This->lpVtbl->ShutdownApplication(This,bstrApplIDOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ExportApplication(ICOMAdminCatalog2* This,BSTR bstrApplIDOrName,BSTR bstrApplicationFile,LONG lOptions) {
    return This->lpVtbl->ExportApplication(This,bstrApplIDOrName,bstrApplicationFile,lOptions);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_InstallApplication(ICOMAdminCatalog2* This,BSTR bstrApplicationFile,BSTR bstrDestinationDirectory,LONG lOptions,BSTR bstrUserId,BSTR bstrPassword,BSTR bstrRSN) {
    return This->lpVtbl->InstallApplication(This,bstrApplicationFile,bstrDestinationDirectory,lOptions,bstrUserId,bstrPassword,bstrRSN);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_StopRouter(ICOMAdminCatalog2* This) {
    return This->lpVtbl->StopRouter(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_RefreshRouter(ICOMAdminCatalog2* This) {
    return This->lpVtbl->RefreshRouter(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_StartRouter(ICOMAdminCatalog2* This) {
    return This->lpVtbl->StartRouter(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_Reserved1(ICOMAdminCatalog2* This) {
    return This->lpVtbl->Reserved1(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_Reserved2(ICOMAdminCatalog2* This) {
    return This->lpVtbl->Reserved2(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_InstallMultipleComponents(ICOMAdminCatalog2* This,BSTR bstrApplIDOrName,SAFEARRAY **ppsaVarFileNames,SAFEARRAY **ppsaVarCLSIDs) {
    return This->lpVtbl->InstallMultipleComponents(This,bstrApplIDOrName,ppsaVarFileNames,ppsaVarCLSIDs);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetMultipleComponentsInfo(ICOMAdminCatalog2* This,BSTR bstrApplIdOrName,SAFEARRAY **ppsaVarFileNames,SAFEARRAY **ppsaVarCLSIDs,SAFEARRAY **ppsaVarClassNames,SAFEARRAY **ppsaVarFileFlags,SAFEARRAY **ppsaVarComponentFlags) {
    return This->lpVtbl->GetMultipleComponentsInfo(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDs,ppsaVarClassNames,ppsaVarFileFlags,ppsaVarComponentFlags);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_RefreshComponents(ICOMAdminCatalog2* This) {
    return This->lpVtbl->RefreshComponents(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_BackupREGDB(ICOMAdminCatalog2* This,BSTR bstrBackupFilePath) {
    return This->lpVtbl->BackupREGDB(This,bstrBackupFilePath);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_RestoreREGDB(ICOMAdminCatalog2* This,BSTR bstrBackupFilePath) {
    return This->lpVtbl->RestoreREGDB(This,bstrBackupFilePath);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_QueryApplicationFile(ICOMAdminCatalog2* This,BSTR bstrApplicationFile,BSTR *pbstrApplicationName,BSTR *pbstrApplicationDescription,VARIANT_BOOL *pbHasUsers,VARIANT_BOOL *pbIsProxy,SAFEARRAY **ppsaVarFileNames) {
    return This->lpVtbl->QueryApplicationFile(This,bstrApplicationFile,pbstrApplicationName,pbstrApplicationDescription,pbHasUsers,pbIsProxy,ppsaVarFileNames);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_StartApplication(ICOMAdminCatalog2* This,BSTR bstrApplIdOrName) {
    return This->lpVtbl->StartApplication(This,bstrApplIdOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ServiceCheck(ICOMAdminCatalog2* This,LONG lService,LONG *plStatus) {
    return This->lpVtbl->ServiceCheck(This,lService,plStatus);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_InstallMultipleEventClasses(ICOMAdminCatalog2* This,BSTR bstrApplIdOrName,SAFEARRAY **ppsaVarFileNames,SAFEARRAY **ppsaVarCLSIDS) {
    return This->lpVtbl->InstallMultipleEventClasses(This,bstrApplIdOrName,ppsaVarFileNames,ppsaVarCLSIDS);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_InstallEventClass(ICOMAdminCatalog2* This,BSTR bstrApplIdOrName,BSTR bstrDLL,BSTR bstrTLB,BSTR bstrPSDLL) {
    return This->lpVtbl->InstallEventClass(This,bstrApplIdOrName,bstrDLL,bstrTLB,bstrPSDLL);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetEventClassesForIID(ICOMAdminCatalog2* This,BSTR bstrIID,SAFEARRAY **ppsaVarCLSIDs,SAFEARRAY **ppsaVarProgIDs,SAFEARRAY **ppsaVarDescriptions) {
    return This->lpVtbl->GetEventClassesForIID(This,bstrIID,ppsaVarCLSIDs,ppsaVarProgIDs,ppsaVarDescriptions);
}
/*** ICOMAdminCatalog2 methods ***/
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetCollectionByQuery2(ICOMAdminCatalog2* This,BSTR bstrCollectionName,VARIANT *pVarQueryStrings,IDispatch **ppCatalogCollection) {
    return This->lpVtbl->GetCollectionByQuery2(This,bstrCollectionName,pVarQueryStrings,ppCatalogCollection);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetApplicationInstanceIDFromProcessID(ICOMAdminCatalog2* This,LONG lProcessID,BSTR *pbstrApplicationInstanceID) {
    return This->lpVtbl->GetApplicationInstanceIDFromProcessID(This,lProcessID,pbstrApplicationInstanceID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ShutdownApplicationInstances(ICOMAdminCatalog2* This,VARIANT *pVarApplicationInstanceID) {
    return This->lpVtbl->ShutdownApplicationInstances(This,pVarApplicationInstanceID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_PauseApplicationInstances(ICOMAdminCatalog2* This,VARIANT *pVarApplicationInstanceID) {
    return This->lpVtbl->PauseApplicationInstances(This,pVarApplicationInstanceID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ResumeApplicationInstances(ICOMAdminCatalog2* This,VARIANT *pVarApplicationInstanceID) {
    return This->lpVtbl->ResumeApplicationInstances(This,pVarApplicationInstanceID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_RecycleApplicationInstances(ICOMAdminCatalog2* This,VARIANT *pVarApplicationInstanceID,LONG lReasonCode) {
    return This->lpVtbl->RecycleApplicationInstances(This,pVarApplicationInstanceID,lReasonCode);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_AreApplicationInstancesPaused(ICOMAdminCatalog2* This,VARIANT *pVarApplicationInstanceID,VARIANT_BOOL *pVarBoolPaused) {
    return This->lpVtbl->AreApplicationInstancesPaused(This,pVarApplicationInstanceID,pVarBoolPaused);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_DumpApplicationInstance(ICOMAdminCatalog2* This,BSTR bstrApplicationInstanceID,BSTR bstrDirectory,LONG lMaxImages,BSTR *pbstrDumpFile) {
    return This->lpVtbl->DumpApplicationInstance(This,bstrApplicationInstanceID,bstrDirectory,lMaxImages,pbstrDumpFile);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_get_IsApplicationInstanceDumpSupported(ICOMAdminCatalog2* This,VARIANT_BOOL *pVarBoolDumpSupported) {
    return This->lpVtbl->get_IsApplicationInstanceDumpSupported(This,pVarBoolDumpSupported);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_CreateServiceForApplication(ICOMAdminCatalog2* This,BSTR bstrApplicationIDOrName,BSTR bstrServiceName,BSTR bstrStartType,BSTR bstrErrorControl,BSTR bstrDependencies,BSTR bstrRunAs,BSTR bstrPassword,VARIANT_BOOL bDesktopOk) {
    return This->lpVtbl->CreateServiceForApplication(This,bstrApplicationIDOrName,bstrServiceName,bstrStartType,bstrErrorControl,bstrDependencies,bstrRunAs,bstrPassword,bDesktopOk);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_DeleteServiceForApplication(ICOMAdminCatalog2* This,BSTR bstrApplicationIDOrName) {
    return This->lpVtbl->DeleteServiceForApplication(This,bstrApplicationIDOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetPartitionID(ICOMAdminCatalog2* This,BSTR bstrApplicationIDOrName,BSTR *pbstrPartitionID) {
    return This->lpVtbl->GetPartitionID(This,bstrApplicationIDOrName,pbstrPartitionID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetPartitionName(ICOMAdminCatalog2* This,BSTR bstrApplicationIDOrName,BSTR *pbstrPartitionName) {
    return This->lpVtbl->GetPartitionName(This,bstrApplicationIDOrName,pbstrPartitionName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_put_CurrentPartition(ICOMAdminCatalog2* This,BSTR bstrPartitionIDOrName) {
    return This->lpVtbl->put_CurrentPartition(This,bstrPartitionIDOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_get_CurrentPartitionID(ICOMAdminCatalog2* This,BSTR *pbstrPartitionID) {
    return This->lpVtbl->get_CurrentPartitionID(This,pbstrPartitionID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_get_CurrentPartitionName(ICOMAdminCatalog2* This,BSTR *pbstrPartitionName) {
    return This->lpVtbl->get_CurrentPartitionName(This,pbstrPartitionName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_get_GlobalPartitionID(ICOMAdminCatalog2* This,BSTR *pbstrGlobalPartitionID) {
    return This->lpVtbl->get_GlobalPartitionID(This,pbstrGlobalPartitionID);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_FlushPartitionCache(ICOMAdminCatalog2* This) {
    return This->lpVtbl->FlushPartitionCache(This);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_CopyApplications(ICOMAdminCatalog2* This,BSTR bstrSourcePartitionIDOrName,VARIANT *pVarApplicationID,BSTR bstrDestinationPartitionIDOrName) {
    return This->lpVtbl->CopyApplications(This,bstrSourcePartitionIDOrName,pVarApplicationID,bstrDestinationPartitionIDOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_CopyComponents(ICOMAdminCatalog2* This,BSTR bstrSourceApplicationIDOrName,VARIANT *pVarCLSIDOrProgID,BSTR bstrDestinationApplicationIDOrName) {
    return This->lpVtbl->CopyComponents(This,bstrSourceApplicationIDOrName,pVarCLSIDOrProgID,bstrDestinationApplicationIDOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_MoveComponents(ICOMAdminCatalog2* This,BSTR bstrSourceApplicationIDOrName,VARIANT *pVarCLSIDOrProgID,BSTR bstrDestinationApplicationIDOrName) {
    return This->lpVtbl->MoveComponents(This,bstrSourceApplicationIDOrName,pVarCLSIDOrProgID,bstrDestinationApplicationIDOrName);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_AliasComponent(ICOMAdminCatalog2* This,BSTR bstrSrcApplicationIDOrName,BSTR bstrCLSIDOrProgID,BSTR bstrDestApplicationIDOrName,BSTR bstrNewProgId,BSTR bstrNewClsid) {
    return This->lpVtbl->AliasComponent(This,bstrSrcApplicationIDOrName,bstrCLSIDOrProgID,bstrDestApplicationIDOrName,bstrNewProgId,bstrNewClsid);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_IsSafeToDelete(ICOMAdminCatalog2* This,BSTR bstrDllName,COMAdminInUse *pCOMAdminInUse) {
    return This->lpVtbl->IsSafeToDelete(This,bstrDllName,pCOMAdminInUse);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ImportUnconfiguredComponents(ICOMAdminCatalog2* This,BSTR bstrApplicationIDOrName,VARIANT *pVarCLSIDOrProgID,VARIANT *pVarComponentType) {
    return This->lpVtbl->ImportUnconfiguredComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_PromoteUnconfiguredComponents(ICOMAdminCatalog2* This,BSTR bstrApplicationIDOrName,VARIANT *pVarCLSIDOrProgID,VARIANT *pVarComponentType) {
    return This->lpVtbl->PromoteUnconfiguredComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ImportComponents(ICOMAdminCatalog2* This,BSTR bstrApplicationIDOrName,VARIANT *pVarCLSIDOrProgID,VARIANT *pVarComponentType) {
    return This->lpVtbl->ImportComponents(This,bstrApplicationIDOrName,pVarCLSIDOrProgID,pVarComponentType);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_get_Is64BitCatalogServer(ICOMAdminCatalog2* This,VARIANT_BOOL *pbIs64Bit) {
    return This->lpVtbl->get_Is64BitCatalogServer(This,pbIs64Bit);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_ExportPartition(ICOMAdminCatalog2* This,BSTR bstrPartitionIDOrName,BSTR bstrPartitionFileName,LONG lOptions) {
    return This->lpVtbl->ExportPartition(This,bstrPartitionIDOrName,bstrPartitionFileName,lOptions);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_InstallPartition(ICOMAdminCatalog2* This,BSTR bstrFileName,BSTR bstrDestDirectory,LONG lOptions,BSTR bstrUserID,BSTR bstrPassword,BSTR bstrRSN) {
    return This->lpVtbl->InstallPartition(This,bstrFileName,bstrDestDirectory,lOptions,bstrUserID,bstrPassword,bstrRSN);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_QueryApplicationFile2(ICOMAdminCatalog2* This,BSTR bstrApplicationFile,IDispatch **ppFilesForImport) {
    return This->lpVtbl->QueryApplicationFile2(This,bstrApplicationFile,ppFilesForImport);
}
static FORCEINLINE HRESULT ICOMAdminCatalog2_GetComponentVersionCount(ICOMAdminCatalog2* This,BSTR bstrCLSIDOrProgID,LONG *plVersionCount) {
    return This->lpVtbl->GetComponentVersionCount(This,bstrCLSIDOrProgID,plVersionCount);
}
#endif
#endif

#endif


#endif  /* __ICOMAdminCatalog2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICatalogObject interface
 */
#ifndef __ICatalogObject_INTERFACE_DEFINED__
#define __ICatalogObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICatalogObject, 0x6eb22871, 0x8a19, 0x11d0, 0x81,0xb6, 0x00,0xa0,0xc9,0x23,0x1c,0x29);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6eb22871-8a19-11d0-81b6-00a0c9231c29")
ICatalogObject : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Value(
        BSTR bstrPropName,
        VARIANT *pvarRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Value(
        BSTR bstrPropName,
        VARIANT val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Key(
        VARIANT *pvarRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        VARIANT *pvarRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPropertyReadOnly(
        BSTR bstrPropName,
        VARIANT_BOOL *pbRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Valid(
        VARIANT_BOOL *pbRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPropertyWriteOnly(
        BSTR bstrPropName,
        VARIANT_BOOL *pbRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICatalogObject, 0x6eb22871, 0x8a19, 0x11d0, 0x81,0xb6, 0x00,0xa0,0xc9,0x23,0x1c,0x29)
#endif
#else
typedef struct ICatalogObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICatalogObject *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICatalogObject *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICatalogObject *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICatalogObject *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICatalogObject *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICatalogObject *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICatalogObject *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICatalogObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        ICatalogObject *This,
        BSTR bstrPropName,
        VARIANT *pvarRetVal);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        ICatalogObject *This,
        BSTR bstrPropName,
        VARIANT val);

    HRESULT (STDMETHODCALLTYPE *get_Key)(
        ICatalogObject *This,
        VARIANT *pvarRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ICatalogObject *This,
        VARIANT *pvarRetVal);

    HRESULT (STDMETHODCALLTYPE *IsPropertyReadOnly)(
        ICatalogObject *This,
        BSTR bstrPropName,
        VARIANT_BOOL *pbRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Valid)(
        ICatalogObject *This,
        VARIANT_BOOL *pbRetVal);

    HRESULT (STDMETHODCALLTYPE *IsPropertyWriteOnly)(
        ICatalogObject *This,
        BSTR bstrPropName,
        VARIANT_BOOL *pbRetVal);

    END_INTERFACE
} ICatalogObjectVtbl;

interface ICatalogObject {
    CONST_VTBL ICatalogObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICatalogObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICatalogObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICatalogObject_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICatalogObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICatalogObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICatalogObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICatalogObject_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICatalogObject methods ***/
#define ICatalogObject_get_Value(This,bstrPropName,pvarRetVal) (This)->lpVtbl->get_Value(This,bstrPropName,pvarRetVal)
#define ICatalogObject_put_Value(This,bstrPropName,val) (This)->lpVtbl->put_Value(This,bstrPropName,val)
#define ICatalogObject_get_Key(This,pvarRetVal) (This)->lpVtbl->get_Key(This,pvarRetVal)
#define ICatalogObject_get_Name(This,pvarRetVal) (This)->lpVtbl->get_Name(This,pvarRetVal)
#define ICatalogObject_IsPropertyReadOnly(This,bstrPropName,pbRetVal) (This)->lpVtbl->IsPropertyReadOnly(This,bstrPropName,pbRetVal)
#define ICatalogObject_get_Valid(This,pbRetVal) (This)->lpVtbl->get_Valid(This,pbRetVal)
#define ICatalogObject_IsPropertyWriteOnly(This,bstrPropName,pbRetVal) (This)->lpVtbl->IsPropertyWriteOnly(This,bstrPropName,pbRetVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICatalogObject_QueryInterface(ICatalogObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICatalogObject_AddRef(ICatalogObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICatalogObject_Release(ICatalogObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICatalogObject_GetTypeInfoCount(ICatalogObject* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICatalogObject_GetTypeInfo(ICatalogObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICatalogObject_GetIDsOfNames(ICatalogObject* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICatalogObject_Invoke(ICatalogObject* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ICatalogObject methods ***/
static FORCEINLINE HRESULT ICatalogObject_get_Value(ICatalogObject* This,BSTR bstrPropName,VARIANT *pvarRetVal) {
    return This->lpVtbl->get_Value(This,bstrPropName,pvarRetVal);
}
static FORCEINLINE HRESULT ICatalogObject_put_Value(ICatalogObject* This,BSTR bstrPropName,VARIANT val) {
    return This->lpVtbl->put_Value(This,bstrPropName,val);
}
static FORCEINLINE HRESULT ICatalogObject_get_Key(ICatalogObject* This,VARIANT *pvarRetVal) {
    return This->lpVtbl->get_Key(This,pvarRetVal);
}
static FORCEINLINE HRESULT ICatalogObject_get_Name(ICatalogObject* This,VARIANT *pvarRetVal) {
    return This->lpVtbl->get_Name(This,pvarRetVal);
}
static FORCEINLINE HRESULT ICatalogObject_IsPropertyReadOnly(ICatalogObject* This,BSTR bstrPropName,VARIANT_BOOL *pbRetVal) {
    return This->lpVtbl->IsPropertyReadOnly(This,bstrPropName,pbRetVal);
}
static FORCEINLINE HRESULT ICatalogObject_get_Valid(ICatalogObject* This,VARIANT_BOOL *pbRetVal) {
    return This->lpVtbl->get_Valid(This,pbRetVal);
}
static FORCEINLINE HRESULT ICatalogObject_IsPropertyWriteOnly(ICatalogObject* This,BSTR bstrPropName,VARIANT_BOOL *pbRetVal) {
    return This->lpVtbl->IsPropertyWriteOnly(This,bstrPropName,pbRetVal);
}
#endif
#endif

#endif


#endif  /* __ICatalogObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICatalogCollection interface
 */
#ifndef __ICatalogCollection_INTERFACE_DEFINED__
#define __ICatalogCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICatalogCollection, 0x6eb22872, 0x8a19, 0x11d0, 0x81,0xb6, 0x00,0xa0,0xc9,0x23,0x1c,0x29);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6eb22872-8a19-11d0-81b6-00a0c9231c29")
ICatalogCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **ppEnumVariant) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG lIndex,
        IDispatch **ppCatalogObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *plObjectCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        LONG lIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        IDispatch **ppCatalogObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE Populate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveChanges(
        LONG *pcChanges) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCollection(
        BSTR bstrCollName,
        VARIANT varObjectKey,
        IDispatch **ppCatalogCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        VARIANT *pVarNamel) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AddEnabled(
        VARIANT_BOOL *pVarBool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RemoveEnabled(
        VARIANT_BOOL *pVarBool) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUtilInterface(
        IDispatch **ppIDispatch) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DataStoreMajorVersion(
        LONG *plMajorVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DataStoreMinorVersion(
        LONG *plMinorVersionl) = 0;

    virtual HRESULT STDMETHODCALLTYPE PopulateByKey(
        SAFEARRAY *psaKeys) = 0;

    virtual HRESULT STDMETHODCALLTYPE PopulateByQuery(
        BSTR bstrQueryString,
        LONG lQueryType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICatalogCollection, 0x6eb22872, 0x8a19, 0x11d0, 0x81,0xb6, 0x00,0xa0,0xc9,0x23,0x1c,0x29)
#endif
#else
typedef struct ICatalogCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ICatalogCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ICatalogCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ICatalogCollection *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ICatalogCollection *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ICatalogCollection *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ICatalogCollection *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ICatalogCollection *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ICatalogCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ICatalogCollection *This,
        IUnknown **ppEnumVariant);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        ICatalogCollection *This,
        LONG lIndex,
        IDispatch **ppCatalogObject);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ICatalogCollection *This,
        LONG *plObjectCount);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ICatalogCollection *This,
        LONG lIndex);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ICatalogCollection *This,
        IDispatch **ppCatalogObject);

    HRESULT (STDMETHODCALLTYPE *Populate)(
        ICatalogCollection *This);

    HRESULT (STDMETHODCALLTYPE *SaveChanges)(
        ICatalogCollection *This,
        LONG *pcChanges);

    HRESULT (STDMETHODCALLTYPE *GetCollection)(
        ICatalogCollection *This,
        BSTR bstrCollName,
        VARIANT varObjectKey,
        IDispatch **ppCatalogCollection);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ICatalogCollection *This,
        VARIANT *pVarNamel);

    HRESULT (STDMETHODCALLTYPE *get_AddEnabled)(
        ICatalogCollection *This,
        VARIANT_BOOL *pVarBool);

    HRESULT (STDMETHODCALLTYPE *get_RemoveEnabled)(
        ICatalogCollection *This,
        VARIANT_BOOL *pVarBool);

    HRESULT (STDMETHODCALLTYPE *GetUtilInterface)(
        ICatalogCollection *This,
        IDispatch **ppIDispatch);

    HRESULT (STDMETHODCALLTYPE *get_DataStoreMajorVersion)(
        ICatalogCollection *This,
        LONG *plMajorVersion);

    HRESULT (STDMETHODCALLTYPE *get_DataStoreMinorVersion)(
        ICatalogCollection *This,
        LONG *plMinorVersionl);

    HRESULT (STDMETHODCALLTYPE *PopulateByKey)(
        ICatalogCollection *This,
        SAFEARRAY *psaKeys);

    HRESULT (STDMETHODCALLTYPE *PopulateByQuery)(
        ICatalogCollection *This,
        BSTR bstrQueryString,
        LONG lQueryType);

    END_INTERFACE
} ICatalogCollectionVtbl;

interface ICatalogCollection {
    CONST_VTBL ICatalogCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICatalogCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICatalogCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICatalogCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICatalogCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICatalogCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICatalogCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICatalogCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICatalogCollection methods ***/
#define ICatalogCollection_get__NewEnum(This,ppEnumVariant) (This)->lpVtbl->get__NewEnum(This,ppEnumVariant)
#define ICatalogCollection_get_Item(This,lIndex,ppCatalogObject) (This)->lpVtbl->get_Item(This,lIndex,ppCatalogObject)
#define ICatalogCollection_get_Count(This,plObjectCount) (This)->lpVtbl->get_Count(This,plObjectCount)
#define ICatalogCollection_Remove(This,lIndex) (This)->lpVtbl->Remove(This,lIndex)
#define ICatalogCollection_Add(This,ppCatalogObject) (This)->lpVtbl->Add(This,ppCatalogObject)
#define ICatalogCollection_Populate(This) (This)->lpVtbl->Populate(This)
#define ICatalogCollection_SaveChanges(This,pcChanges) (This)->lpVtbl->SaveChanges(This,pcChanges)
#define ICatalogCollection_GetCollection(This,bstrCollName,varObjectKey,ppCatalogCollection) (This)->lpVtbl->GetCollection(This,bstrCollName,varObjectKey,ppCatalogCollection)
#define ICatalogCollection_get_Name(This,pVarNamel) (This)->lpVtbl->get_Name(This,pVarNamel)
#define ICatalogCollection_get_AddEnabled(This,pVarBool) (This)->lpVtbl->get_AddEnabled(This,pVarBool)
#define ICatalogCollection_get_RemoveEnabled(This,pVarBool) (This)->lpVtbl->get_RemoveEnabled(This,pVarBool)
#define ICatalogCollection_GetUtilInterface(This,ppIDispatch) (This)->lpVtbl->GetUtilInterface(This,ppIDispatch)
#define ICatalogCollection_get_DataStoreMajorVersion(This,plMajorVersion) (This)->lpVtbl->get_DataStoreMajorVersion(This,plMajorVersion)
#define ICatalogCollection_get_DataStoreMinorVersion(This,plMinorVersionl) (This)->lpVtbl->get_DataStoreMinorVersion(This,plMinorVersionl)
#define ICatalogCollection_PopulateByKey(This,psaKeys) (This)->lpVtbl->PopulateByKey(This,psaKeys)
#define ICatalogCollection_PopulateByQuery(This,bstrQueryString,lQueryType) (This)->lpVtbl->PopulateByQuery(This,bstrQueryString,lQueryType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICatalogCollection_QueryInterface(ICatalogCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICatalogCollection_AddRef(ICatalogCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICatalogCollection_Release(ICatalogCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICatalogCollection_GetTypeInfoCount(ICatalogCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICatalogCollection_GetTypeInfo(ICatalogCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICatalogCollection_GetIDsOfNames(ICatalogCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICatalogCollection_Invoke(ICatalogCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ICatalogCollection methods ***/
static FORCEINLINE HRESULT ICatalogCollection_get__NewEnum(ICatalogCollection* This,IUnknown **ppEnumVariant) {
    return This->lpVtbl->get__NewEnum(This,ppEnumVariant);
}
static FORCEINLINE HRESULT ICatalogCollection_get_Item(ICatalogCollection* This,LONG lIndex,IDispatch **ppCatalogObject) {
    return This->lpVtbl->get_Item(This,lIndex,ppCatalogObject);
}
static FORCEINLINE HRESULT ICatalogCollection_get_Count(ICatalogCollection* This,LONG *plObjectCount) {
    return This->lpVtbl->get_Count(This,plObjectCount);
}
static FORCEINLINE HRESULT ICatalogCollection_Remove(ICatalogCollection* This,LONG lIndex) {
    return This->lpVtbl->Remove(This,lIndex);
}
static FORCEINLINE HRESULT ICatalogCollection_Add(ICatalogCollection* This,IDispatch **ppCatalogObject) {
    return This->lpVtbl->Add(This,ppCatalogObject);
}
static FORCEINLINE HRESULT ICatalogCollection_Populate(ICatalogCollection* This) {
    return This->lpVtbl->Populate(This);
}
static FORCEINLINE HRESULT ICatalogCollection_SaveChanges(ICatalogCollection* This,LONG *pcChanges) {
    return This->lpVtbl->SaveChanges(This,pcChanges);
}
static FORCEINLINE HRESULT ICatalogCollection_GetCollection(ICatalogCollection* This,BSTR bstrCollName,VARIANT varObjectKey,IDispatch **ppCatalogCollection) {
    return This->lpVtbl->GetCollection(This,bstrCollName,varObjectKey,ppCatalogCollection);
}
static FORCEINLINE HRESULT ICatalogCollection_get_Name(ICatalogCollection* This,VARIANT *pVarNamel) {
    return This->lpVtbl->get_Name(This,pVarNamel);
}
static FORCEINLINE HRESULT ICatalogCollection_get_AddEnabled(ICatalogCollection* This,VARIANT_BOOL *pVarBool) {
    return This->lpVtbl->get_AddEnabled(This,pVarBool);
}
static FORCEINLINE HRESULT ICatalogCollection_get_RemoveEnabled(ICatalogCollection* This,VARIANT_BOOL *pVarBool) {
    return This->lpVtbl->get_RemoveEnabled(This,pVarBool);
}
static FORCEINLINE HRESULT ICatalogCollection_GetUtilInterface(ICatalogCollection* This,IDispatch **ppIDispatch) {
    return This->lpVtbl->GetUtilInterface(This,ppIDispatch);
}
static FORCEINLINE HRESULT ICatalogCollection_get_DataStoreMajorVersion(ICatalogCollection* This,LONG *plMajorVersion) {
    return This->lpVtbl->get_DataStoreMajorVersion(This,plMajorVersion);
}
static FORCEINLINE HRESULT ICatalogCollection_get_DataStoreMinorVersion(ICatalogCollection* This,LONG *plMinorVersionl) {
    return This->lpVtbl->get_DataStoreMinorVersion(This,plMinorVersionl);
}
static FORCEINLINE HRESULT ICatalogCollection_PopulateByKey(ICatalogCollection* This,SAFEARRAY *psaKeys) {
    return This->lpVtbl->PopulateByKey(This,psaKeys);
}
static FORCEINLINE HRESULT ICatalogCollection_PopulateByQuery(ICatalogCollection* This,BSTR bstrQueryString,LONG lQueryType) {
    return This->lpVtbl->PopulateByQuery(This,bstrQueryString,lQueryType);
}
#endif
#endif

#endif


#endif  /* __ICatalogCollection_INTERFACE_DEFINED__ */


DEFINE_GUID(LIBID_COMAdmin, 0xf618c513, 0xdfb8, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35);

/*****************************************************************************
 * COMAdminCatalog coclass
 */

DEFINE_GUID(CLSID_COMAdminCatalog, 0xf618c514, 0xdfb8, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35);

#ifdef __cplusplus
class DECLSPEC_UUID("f618c514-dfb8-11d1-a2cf-00805fc79235") COMAdminCatalog;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(COMAdminCatalog, 0xf618c514, 0xdfb8, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35)
#endif
#endif

/*****************************************************************************
 * COMAdminCatalogObject coclass
 */

DEFINE_GUID(CLSID_COMAdminCatalogObject, 0xf618c515, 0xdfb8, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35);

#ifdef __cplusplus
class DECLSPEC_UUID("f618c515-dfb8-11d1-a2cf-00805fc79235") COMAdminCatalogObject;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(COMAdminCatalogObject, 0xf618c515, 0xdfb8, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35)
#endif
#endif

/*****************************************************************************
 * COMAdminCatalogCollection coclass
 */

DEFINE_GUID(CLSID_COMAdminCatalogCollection, 0xf618c516, 0xdfb8, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35);

#ifdef __cplusplus
class DECLSPEC_UUID("f618c516-dfb8-11d1-a2cf-00805fc79235") COMAdminCatalogCollection;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(COMAdminCatalogCollection, 0xf618c516, 0xdfb8, 0x11d1, 0xa2,0xcf, 0x00,0x80,0x5f,0xc7,0x92,0x35)
#endif
#endif

#define COMAdminCollectionRoot ("Root")

#define COMAdminCollectionApplications ("Applications")

#define COMAdminCollectionComponents ("Components")

#define COMAdminCollectionComputerList ("ComputerList")

#define COMAdminCollectionApplicationCluster ("ApplicationCluster")

#define COMAdminCollectionLocalComputer ("LocalComputer")

#define COMAdminCollectionInprocServers ("InprocServers")

#define COMAdminCollectionRelatedCollectionInfo ("RelatedCollectionInfo")

#define COMAdminCollectionPropertyInfo ("PropertyInfo")

#define COMAdminCollectionRoles ("Roles")

#define COMAdminCollectionErrorInfo ("ErrorInfo")

#define COMAdminCollectionInterfacesForComponent ("InterfacesForComponent")

#define COMAdminCollectionRolesForComponent ("RolesForComponent")

#define COMAdminCollectionMethodsForInterface ("MethodsForInterface")

#define COMAdminCollectionRolesForInterface ("RolesForInterface")

#define COMAdminCollectionRolesForMethod ("RolesForMethod")

#define COMAdminCollectionUsersInRole ("UsersInRole")

#define COMAdminCollectionDCOMProtocols ("DCOMProtocols")

#define COMAdminCollectionPartitions ("Partitions")

#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __comadmin_h__ */
