/*** Autogenerated by WIDL 9.17 from include/xpsdigitalsignature.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __xpsdigitalsignature_h__
#define __xpsdigitalsignature_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IXpsSigningOptions_FWD_DEFINED__
#define __IXpsSigningOptions_FWD_DEFINED__
typedef interface IXpsSigningOptions IXpsSigningOptions;
#ifdef __cplusplus
interface IXpsSigningOptions;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignature_FWD_DEFINED__
#define __IXpsSignature_FWD_DEFINED__
typedef interface IXpsSignature IXpsSignature;
#ifdef __cplusplus
interface IXpsSignature;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureBlock_FWD_DEFINED__
#define __IXpsSignatureBlock_FWD_DEFINED__
typedef interface IXpsSignatureBlock IXpsSignatureBlock;
#ifdef __cplusplus
interface IXpsSignatureBlock;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureBlockCollection_FWD_DEFINED__
#define __IXpsSignatureBlockCollection_FWD_DEFINED__
typedef interface IXpsSignatureBlockCollection IXpsSignatureBlockCollection;
#ifdef __cplusplus
interface IXpsSignatureBlockCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureCollection_FWD_DEFINED__
#define __IXpsSignatureCollection_FWD_DEFINED__
typedef interface IXpsSignatureCollection IXpsSignatureCollection;
#ifdef __cplusplus
interface IXpsSignatureCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureManager_FWD_DEFINED__
#define __IXpsSignatureManager_FWD_DEFINED__
typedef interface IXpsSignatureManager IXpsSignatureManager;
#ifdef __cplusplus
interface IXpsSignatureManager;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureRequest_FWD_DEFINED__
#define __IXpsSignatureRequest_FWD_DEFINED__
typedef interface IXpsSignatureRequest IXpsSignatureRequest;
#ifdef __cplusplus
interface IXpsSignatureRequest;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureRequestCollection_FWD_DEFINED__
#define __IXpsSignatureRequestCollection_FWD_DEFINED__
typedef interface IXpsSignatureRequestCollection IXpsSignatureRequestCollection;
#ifdef __cplusplus
interface IXpsSignatureRequestCollection;
#endif /* __cplusplus */
#endif

#ifndef __XpsSignatureManager_FWD_DEFINED__
#define __XpsSignatureManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class XpsSignatureManager XpsSignatureManager;
#else
typedef struct XpsSignatureManager XpsSignatureManager;
#endif /* defined __cplusplus */
#endif /* defined __XpsSignatureManager_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <wincrypt.h>
#include <msopc.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#if NTDDI_VERSION >= 0x06010000
#define XPS_E_SIGREQUESTID_DUP  MAKE_HRESULT(1, FACILITY_XPS, 901)
#define XPS_E_PACKAGE_NOT_OPENED MAKE_HRESULT(1, FACILITY_XPS, 902)
#define XPS_E_PACKAGE_ALREADY_OPENED MAKE_HRESULT(1, FACILITY_XPS, 903)
#define XPS_E_SIGNATUREID_DUP MAKE_HRESULT(1, FACILITY_XPS, 904)
#define XPS_E_MARKUP_COMPATIBILITY_ELEMENTS MAKE_HRESULT(1, FACILITY_XPS, 905)
#define XPS_E_OBJECT_DETACHED MAKE_HRESULT(1, FACILITY_XPS, 906)
#define XPS_E_INVALID_SIGNATUREBLOCK_MARKUP MAKE_HRESULT(1, FACILITY_XPS, 907)
#ifndef __MSXPSSIG_LIBRARY_DEFINED__
#define __MSXPSSIG_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_MSXPSSIG, 0x8223a7eb, 0xc4d5, 0x474d, 0x9b,0xcc, 0xff,0x67,0x18,0x5e,0x64,0xa0);

#ifndef __IXpsSigningOptions_FWD_DEFINED__
#define __IXpsSigningOptions_FWD_DEFINED__
typedef interface IXpsSigningOptions IXpsSigningOptions;
#ifdef __cplusplus
interface IXpsSigningOptions;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureCollection_FWD_DEFINED__
#define __IXpsSignatureCollection_FWD_DEFINED__
typedef interface IXpsSignatureCollection IXpsSignatureCollection;
#ifdef __cplusplus
interface IXpsSignatureCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignature_FWD_DEFINED__
#define __IXpsSignature_FWD_DEFINED__
typedef interface IXpsSignature IXpsSignature;
#ifdef __cplusplus
interface IXpsSignature;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureBlockCollection_FWD_DEFINED__
#define __IXpsSignatureBlockCollection_FWD_DEFINED__
typedef interface IXpsSignatureBlockCollection IXpsSignatureBlockCollection;
#ifdef __cplusplus
interface IXpsSignatureBlockCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureBlock_FWD_DEFINED__
#define __IXpsSignatureBlock_FWD_DEFINED__
typedef interface IXpsSignatureBlock IXpsSignatureBlock;
#ifdef __cplusplus
interface IXpsSignatureBlock;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureRequestCollection_FWD_DEFINED__
#define __IXpsSignatureRequestCollection_FWD_DEFINED__
typedef interface IXpsSignatureRequestCollection IXpsSignatureRequestCollection;
#ifdef __cplusplus
interface IXpsSignatureRequestCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsSignatureRequest_FWD_DEFINED__
#define __IXpsSignatureRequest_FWD_DEFINED__
typedef interface IXpsSignatureRequest IXpsSignatureRequest;
#ifdef __cplusplus
interface IXpsSignatureRequest;
#endif /* __cplusplus */
#endif

typedef enum __WIDL_xpsdigitalsignature_generated_name_00000031 {
    XPS_SIGN_FLAGS_NONE = 0x0,
    XPS_SIGN_FLAGS_IGNORE_MARKUP_COMPATIBILITY = 0x1
} XPS_SIGN_FLAGS;
typedef enum __WIDL_xpsdigitalsignature_generated_name_00000032 {
    XPS_SIGN_POLICY_NONE = 0x0,
    XPS_SIGN_POLICY_CORE_PROPERTIES = 0x1,
    XPS_SIGN_POLICY_SIGNATURE_RELATIONSHIPS = 0x2,
    XPS_SIGN_POLICY_PRINT_TICKET = 0x4,
    XPS_SIGN_POLICY_DISCARD_CONTROL = 0x8,
    XPS_SIGN_POLICY_ALL = 0xf
} XPS_SIGN_POLICY;
typedef enum __WIDL_xpsdigitalsignature_generated_name_00000033 {
    XPS_SIGNATURE_STATUS_INCOMPLIANT = 1,
    XPS_SIGNATURE_STATUS_INCOMPLETE = 2,
    XPS_SIGNATURE_STATUS_BROKEN = 3,
    XPS_SIGNATURE_STATUS_QUESTIONABLE = 4,
    XPS_SIGNATURE_STATUS_VALID = 5
} XPS_SIGNATURE_STATUS;
DEFINE_ENUM_FLAG_OPERATORS(XPS_SIGN_FLAGS)
DEFINE_ENUM_FLAG_OPERATORS(XPS_SIGN_POLICY)
/*****************************************************************************
 * IXpsSigningOptions interface
 */
#ifndef __IXpsSigningOptions_INTERFACE_DEFINED__
#define __IXpsSigningOptions_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsSigningOptions, 0x7718eae4, 0x3215, 0x49be, 0xaf,0x5b, 0x59,0x4f,0xef,0x7f,0xcf,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7718eae4-3215-49be-af5b-594fef7fcfa6")
IXpsSigningOptions : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSignatureId(
        LPWSTR *signatureId) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSignatureId(
        LPCWSTR signatureId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureMethod(
        LPWSTR *signatureMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSignatureMethod(
        LPCWSTR signatureMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDigestMethod(
        LPWSTR *digestMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDigestMethod(
        LPCWSTR digestMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignaturePartName(
        IOpcPartUri **signaturePartName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSignaturePartName(
        IOpcPartUri *signaturePartName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPolicy(
        XPS_SIGN_POLICY *policy) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPolicy(
        XPS_SIGN_POLICY policy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSigningTimeFormat(
        OPC_SIGNATURE_TIME_FORMAT *timeFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSigningTimeFormat(
        OPC_SIGNATURE_TIME_FORMAT timeFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCustomObjects(
        IOpcSignatureCustomObjectSet **customObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCustomReferences(
        IOpcSignatureReferenceSet **customReferenceSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCertificateSet(
        IOpcCertificateSet **certificateSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlags(
        XPS_SIGN_FLAGS *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFlags(
        XPS_SIGN_FLAGS flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsSigningOptions, 0x7718eae4, 0x3215, 0x49be, 0xaf,0x5b, 0x59,0x4f,0xef,0x7f,0xcf,0xa6)
#endif
#else
typedef struct IXpsSigningOptionsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsSigningOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSignatureId)(
        IXpsSigningOptions *This,
        LPWSTR *signatureId);

    HRESULT (STDMETHODCALLTYPE *SetSignatureId)(
        IXpsSigningOptions *This,
        LPCWSTR signatureId);

    HRESULT (STDMETHODCALLTYPE *GetSignatureMethod)(
        IXpsSigningOptions *This,
        LPWSTR *signatureMethod);

    HRESULT (STDMETHODCALLTYPE *SetSignatureMethod)(
        IXpsSigningOptions *This,
        LPCWSTR signatureMethod);

    HRESULT (STDMETHODCALLTYPE *GetDigestMethod)(
        IXpsSigningOptions *This,
        LPWSTR *digestMethod);

    HRESULT (STDMETHODCALLTYPE *SetDigestMethod)(
        IXpsSigningOptions *This,
        LPCWSTR digestMethod);

    HRESULT (STDMETHODCALLTYPE *GetSignaturePartName)(
        IXpsSigningOptions *This,
        IOpcPartUri **signaturePartName);

    HRESULT (STDMETHODCALLTYPE *SetSignaturePartName)(
        IXpsSigningOptions *This,
        IOpcPartUri *signaturePartName);

    HRESULT (STDMETHODCALLTYPE *GetPolicy)(
        IXpsSigningOptions *This,
        XPS_SIGN_POLICY *policy);

    HRESULT (STDMETHODCALLTYPE *SetPolicy)(
        IXpsSigningOptions *This,
        XPS_SIGN_POLICY policy);

    HRESULT (STDMETHODCALLTYPE *GetSigningTimeFormat)(
        IXpsSigningOptions *This,
        OPC_SIGNATURE_TIME_FORMAT *timeFormat);

    HRESULT (STDMETHODCALLTYPE *SetSigningTimeFormat)(
        IXpsSigningOptions *This,
        OPC_SIGNATURE_TIME_FORMAT timeFormat);

    HRESULT (STDMETHODCALLTYPE *GetCustomObjects)(
        IXpsSigningOptions *This,
        IOpcSignatureCustomObjectSet **customObjectSet);

    HRESULT (STDMETHODCALLTYPE *GetCustomReferences)(
        IXpsSigningOptions *This,
        IOpcSignatureReferenceSet **customReferenceSet);

    HRESULT (STDMETHODCALLTYPE *GetCertificateSet)(
        IXpsSigningOptions *This,
        IOpcCertificateSet **certificateSet);

    HRESULT (STDMETHODCALLTYPE *GetFlags)(
        IXpsSigningOptions *This,
        XPS_SIGN_FLAGS *flags);

    HRESULT (STDMETHODCALLTYPE *SetFlags)(
        IXpsSigningOptions *This,
        XPS_SIGN_FLAGS flags);

    END_INTERFACE
} IXpsSigningOptionsVtbl;

interface IXpsSigningOptions {
    CONST_VTBL IXpsSigningOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsSigningOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsSigningOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsSigningOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsSigningOptions methods ***/
#define IXpsSigningOptions_GetSignatureId(This,signatureId) (This)->lpVtbl->GetSignatureId(This,signatureId)
#define IXpsSigningOptions_SetSignatureId(This,signatureId) (This)->lpVtbl->SetSignatureId(This,signatureId)
#define IXpsSigningOptions_GetSignatureMethod(This,signatureMethod) (This)->lpVtbl->GetSignatureMethod(This,signatureMethod)
#define IXpsSigningOptions_SetSignatureMethod(This,signatureMethod) (This)->lpVtbl->SetSignatureMethod(This,signatureMethod)
#define IXpsSigningOptions_GetDigestMethod(This,digestMethod) (This)->lpVtbl->GetDigestMethod(This,digestMethod)
#define IXpsSigningOptions_SetDigestMethod(This,digestMethod) (This)->lpVtbl->SetDigestMethod(This,digestMethod)
#define IXpsSigningOptions_GetSignaturePartName(This,signaturePartName) (This)->lpVtbl->GetSignaturePartName(This,signaturePartName)
#define IXpsSigningOptions_SetSignaturePartName(This,signaturePartName) (This)->lpVtbl->SetSignaturePartName(This,signaturePartName)
#define IXpsSigningOptions_GetPolicy(This,policy) (This)->lpVtbl->GetPolicy(This,policy)
#define IXpsSigningOptions_SetPolicy(This,policy) (This)->lpVtbl->SetPolicy(This,policy)
#define IXpsSigningOptions_GetSigningTimeFormat(This,timeFormat) (This)->lpVtbl->GetSigningTimeFormat(This,timeFormat)
#define IXpsSigningOptions_SetSigningTimeFormat(This,timeFormat) (This)->lpVtbl->SetSigningTimeFormat(This,timeFormat)
#define IXpsSigningOptions_GetCustomObjects(This,customObjectSet) (This)->lpVtbl->GetCustomObjects(This,customObjectSet)
#define IXpsSigningOptions_GetCustomReferences(This,customReferenceSet) (This)->lpVtbl->GetCustomReferences(This,customReferenceSet)
#define IXpsSigningOptions_GetCertificateSet(This,certificateSet) (This)->lpVtbl->GetCertificateSet(This,certificateSet)
#define IXpsSigningOptions_GetFlags(This,flags) (This)->lpVtbl->GetFlags(This,flags)
#define IXpsSigningOptions_SetFlags(This,flags) (This)->lpVtbl->SetFlags(This,flags)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsSigningOptions_QueryInterface(IXpsSigningOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsSigningOptions_AddRef(IXpsSigningOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsSigningOptions_Release(IXpsSigningOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsSigningOptions methods ***/
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetSignatureId(IXpsSigningOptions* This,LPWSTR *signatureId) {
    return This->lpVtbl->GetSignatureId(This,signatureId);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_SetSignatureId(IXpsSigningOptions* This,LPCWSTR signatureId) {
    return This->lpVtbl->SetSignatureId(This,signatureId);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetSignatureMethod(IXpsSigningOptions* This,LPWSTR *signatureMethod) {
    return This->lpVtbl->GetSignatureMethod(This,signatureMethod);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_SetSignatureMethod(IXpsSigningOptions* This,LPCWSTR signatureMethod) {
    return This->lpVtbl->SetSignatureMethod(This,signatureMethod);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetDigestMethod(IXpsSigningOptions* This,LPWSTR *digestMethod) {
    return This->lpVtbl->GetDigestMethod(This,digestMethod);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_SetDigestMethod(IXpsSigningOptions* This,LPCWSTR digestMethod) {
    return This->lpVtbl->SetDigestMethod(This,digestMethod);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetSignaturePartName(IXpsSigningOptions* This,IOpcPartUri **signaturePartName) {
    return This->lpVtbl->GetSignaturePartName(This,signaturePartName);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_SetSignaturePartName(IXpsSigningOptions* This,IOpcPartUri *signaturePartName) {
    return This->lpVtbl->SetSignaturePartName(This,signaturePartName);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetPolicy(IXpsSigningOptions* This,XPS_SIGN_POLICY *policy) {
    return This->lpVtbl->GetPolicy(This,policy);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_SetPolicy(IXpsSigningOptions* This,XPS_SIGN_POLICY policy) {
    return This->lpVtbl->SetPolicy(This,policy);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetSigningTimeFormat(IXpsSigningOptions* This,OPC_SIGNATURE_TIME_FORMAT *timeFormat) {
    return This->lpVtbl->GetSigningTimeFormat(This,timeFormat);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_SetSigningTimeFormat(IXpsSigningOptions* This,OPC_SIGNATURE_TIME_FORMAT timeFormat) {
    return This->lpVtbl->SetSigningTimeFormat(This,timeFormat);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetCustomObjects(IXpsSigningOptions* This,IOpcSignatureCustomObjectSet **customObjectSet) {
    return This->lpVtbl->GetCustomObjects(This,customObjectSet);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetCustomReferences(IXpsSigningOptions* This,IOpcSignatureReferenceSet **customReferenceSet) {
    return This->lpVtbl->GetCustomReferences(This,customReferenceSet);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetCertificateSet(IXpsSigningOptions* This,IOpcCertificateSet **certificateSet) {
    return This->lpVtbl->GetCertificateSet(This,certificateSet);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_GetFlags(IXpsSigningOptions* This,XPS_SIGN_FLAGS *flags) {
    return This->lpVtbl->GetFlags(This,flags);
}
static __WIDL_INLINE HRESULT IXpsSigningOptions_SetFlags(IXpsSigningOptions* This,XPS_SIGN_FLAGS flags) {
    return This->lpVtbl->SetFlags(This,flags);
}
#endif
#endif

#endif


#endif  /* __IXpsSigningOptions_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsSignature interface
 */
#ifndef __IXpsSignature_INTERFACE_DEFINED__
#define __IXpsSignature_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsSignature, 0x6ae4c93e, 0x1ade, 0x42fb, 0x89,0x8b, 0x3a,0x56,0x58,0x28,0x48,0x57);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6ae4c93e-1ade-42fb-898b-3a5658284857")
IXpsSignature : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSignatureId(
        LPWSTR *sigId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureValue(
        UINT8 **signatureHashValue,
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCertificateEnumerator(
        IOpcCertificateEnumerator **certificateEnumerator) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSigningTime(
        LPWSTR *sigDateTimeString) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSigningTimeFormat(
        OPC_SIGNATURE_TIME_FORMAT *timeFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignaturePartName(
        IOpcPartUri **signaturePartName) = 0;

    virtual HRESULT STDMETHODCALLTYPE Verify(
        const CERT_CONTEXT *x509Certificate,
        XPS_SIGNATURE_STATUS *sigStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPolicy(
        XPS_SIGN_POLICY *policy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCustomObjectEnumerator(
        IOpcSignatureCustomObjectEnumerator **customObjectEnumerator) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCustomReferenceEnumerator(
        IOpcSignatureReferenceEnumerator **customReferenceEnumerator) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureXml(
        UINT8 **signatureXml,
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSignatureXml(
        const UINT8 *signatureXml,
        UINT32 count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsSignature, 0x6ae4c93e, 0x1ade, 0x42fb, 0x89,0x8b, 0x3a,0x56,0x58,0x28,0x48,0x57)
#endif
#else
typedef struct IXpsSignatureVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsSignature methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSignatureId)(
        IXpsSignature *This,
        LPWSTR *sigId);

    HRESULT (STDMETHODCALLTYPE *GetSignatureValue)(
        IXpsSignature *This,
        UINT8 **signatureHashValue,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetCertificateEnumerator)(
        IXpsSignature *This,
        IOpcCertificateEnumerator **certificateEnumerator);

    HRESULT (STDMETHODCALLTYPE *GetSigningTime)(
        IXpsSignature *This,
        LPWSTR *sigDateTimeString);

    HRESULT (STDMETHODCALLTYPE *GetSigningTimeFormat)(
        IXpsSignature *This,
        OPC_SIGNATURE_TIME_FORMAT *timeFormat);

    HRESULT (STDMETHODCALLTYPE *GetSignaturePartName)(
        IXpsSignature *This,
        IOpcPartUri **signaturePartName);

    HRESULT (STDMETHODCALLTYPE *Verify)(
        IXpsSignature *This,
        const CERT_CONTEXT *x509Certificate,
        XPS_SIGNATURE_STATUS *sigStatus);

    HRESULT (STDMETHODCALLTYPE *GetPolicy)(
        IXpsSignature *This,
        XPS_SIGN_POLICY *policy);

    HRESULT (STDMETHODCALLTYPE *GetCustomObjectEnumerator)(
        IXpsSignature *This,
        IOpcSignatureCustomObjectEnumerator **customObjectEnumerator);

    HRESULT (STDMETHODCALLTYPE *GetCustomReferenceEnumerator)(
        IXpsSignature *This,
        IOpcSignatureReferenceEnumerator **customReferenceEnumerator);

    HRESULT (STDMETHODCALLTYPE *GetSignatureXml)(
        IXpsSignature *This,
        UINT8 **signatureXml,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *SetSignatureXml)(
        IXpsSignature *This,
        const UINT8 *signatureXml,
        UINT32 count);

    END_INTERFACE
} IXpsSignatureVtbl;

interface IXpsSignature {
    CONST_VTBL IXpsSignatureVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsSignature_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsSignature_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsSignature_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsSignature methods ***/
#define IXpsSignature_GetSignatureId(This,sigId) (This)->lpVtbl->GetSignatureId(This,sigId)
#define IXpsSignature_GetSignatureValue(This,signatureHashValue,count) (This)->lpVtbl->GetSignatureValue(This,signatureHashValue,count)
#define IXpsSignature_GetCertificateEnumerator(This,certificateEnumerator) (This)->lpVtbl->GetCertificateEnumerator(This,certificateEnumerator)
#define IXpsSignature_GetSigningTime(This,sigDateTimeString) (This)->lpVtbl->GetSigningTime(This,sigDateTimeString)
#define IXpsSignature_GetSigningTimeFormat(This,timeFormat) (This)->lpVtbl->GetSigningTimeFormat(This,timeFormat)
#define IXpsSignature_GetSignaturePartName(This,signaturePartName) (This)->lpVtbl->GetSignaturePartName(This,signaturePartName)
#define IXpsSignature_Verify(This,x509Certificate,sigStatus) (This)->lpVtbl->Verify(This,x509Certificate,sigStatus)
#define IXpsSignature_GetPolicy(This,policy) (This)->lpVtbl->GetPolicy(This,policy)
#define IXpsSignature_GetCustomObjectEnumerator(This,customObjectEnumerator) (This)->lpVtbl->GetCustomObjectEnumerator(This,customObjectEnumerator)
#define IXpsSignature_GetCustomReferenceEnumerator(This,customReferenceEnumerator) (This)->lpVtbl->GetCustomReferenceEnumerator(This,customReferenceEnumerator)
#define IXpsSignature_GetSignatureXml(This,signatureXml,count) (This)->lpVtbl->GetSignatureXml(This,signatureXml,count)
#define IXpsSignature_SetSignatureXml(This,signatureXml,count) (This)->lpVtbl->SetSignatureXml(This,signatureXml,count)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsSignature_QueryInterface(IXpsSignature* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsSignature_AddRef(IXpsSignature* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsSignature_Release(IXpsSignature* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsSignature methods ***/
static __WIDL_INLINE HRESULT IXpsSignature_GetSignatureId(IXpsSignature* This,LPWSTR *sigId) {
    return This->lpVtbl->GetSignatureId(This,sigId);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetSignatureValue(IXpsSignature* This,UINT8 **signatureHashValue,UINT32 *count) {
    return This->lpVtbl->GetSignatureValue(This,signatureHashValue,count);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetCertificateEnumerator(IXpsSignature* This,IOpcCertificateEnumerator **certificateEnumerator) {
    return This->lpVtbl->GetCertificateEnumerator(This,certificateEnumerator);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetSigningTime(IXpsSignature* This,LPWSTR *sigDateTimeString) {
    return This->lpVtbl->GetSigningTime(This,sigDateTimeString);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetSigningTimeFormat(IXpsSignature* This,OPC_SIGNATURE_TIME_FORMAT *timeFormat) {
    return This->lpVtbl->GetSigningTimeFormat(This,timeFormat);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetSignaturePartName(IXpsSignature* This,IOpcPartUri **signaturePartName) {
    return This->lpVtbl->GetSignaturePartName(This,signaturePartName);
}
static __WIDL_INLINE HRESULT IXpsSignature_Verify(IXpsSignature* This,const CERT_CONTEXT *x509Certificate,XPS_SIGNATURE_STATUS *sigStatus) {
    return This->lpVtbl->Verify(This,x509Certificate,sigStatus);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetPolicy(IXpsSignature* This,XPS_SIGN_POLICY *policy) {
    return This->lpVtbl->GetPolicy(This,policy);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetCustomObjectEnumerator(IXpsSignature* This,IOpcSignatureCustomObjectEnumerator **customObjectEnumerator) {
    return This->lpVtbl->GetCustomObjectEnumerator(This,customObjectEnumerator);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetCustomReferenceEnumerator(IXpsSignature* This,IOpcSignatureReferenceEnumerator **customReferenceEnumerator) {
    return This->lpVtbl->GetCustomReferenceEnumerator(This,customReferenceEnumerator);
}
static __WIDL_INLINE HRESULT IXpsSignature_GetSignatureXml(IXpsSignature* This,UINT8 **signatureXml,UINT32 *count) {
    return This->lpVtbl->GetSignatureXml(This,signatureXml,count);
}
static __WIDL_INLINE HRESULT IXpsSignature_SetSignatureXml(IXpsSignature* This,const UINT8 *signatureXml,UINT32 count) {
    return This->lpVtbl->SetSignatureXml(This,signatureXml,count);
}
#endif
#endif

#endif


#endif  /* __IXpsSignature_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsSignatureBlock interface
 */
#ifndef __IXpsSignatureBlock_INTERFACE_DEFINED__
#define __IXpsSignatureBlock_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsSignatureBlock, 0x151fac09, 0x0b97, 0x4ac6, 0xa3,0x23, 0x5e,0x42,0x97,0xd4,0x32,0x2b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("151fac09-0b97-4ac6-a323-5e4297d4322b")
IXpsSignatureBlock : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRequests(
        IXpsSignatureRequestCollection **requests) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPartName(
        IOpcPartUri **partName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocumentIndex(
        UINT32 *fixedDocumentIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocumentName(
        IOpcPartUri **fixedDocumentName) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRequest(
        LPCWSTR requestId,
        IXpsSignatureRequest **signatureRequest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsSignatureBlock, 0x151fac09, 0x0b97, 0x4ac6, 0xa3,0x23, 0x5e,0x42,0x97,0xd4,0x32,0x2b)
#endif
#else
typedef struct IXpsSignatureBlockVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsSignatureBlock methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRequests)(
        IXpsSignatureBlock *This,
        IXpsSignatureRequestCollection **requests);

    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsSignatureBlock *This,
        IOpcPartUri **partName);

    HRESULT (STDMETHODCALLTYPE *GetDocumentIndex)(
        IXpsSignatureBlock *This,
        UINT32 *fixedDocumentIndex);

    HRESULT (STDMETHODCALLTYPE *GetDocumentName)(
        IXpsSignatureBlock *This,
        IOpcPartUri **fixedDocumentName);

    HRESULT (STDMETHODCALLTYPE *CreateRequest)(
        IXpsSignatureBlock *This,
        LPCWSTR requestId,
        IXpsSignatureRequest **signatureRequest);

    END_INTERFACE
} IXpsSignatureBlockVtbl;

interface IXpsSignatureBlock {
    CONST_VTBL IXpsSignatureBlockVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsSignatureBlock_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsSignatureBlock_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsSignatureBlock_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsSignatureBlock methods ***/
#define IXpsSignatureBlock_GetRequests(This,requests) (This)->lpVtbl->GetRequests(This,requests)
#define IXpsSignatureBlock_GetPartName(This,partName) (This)->lpVtbl->GetPartName(This,partName)
#define IXpsSignatureBlock_GetDocumentIndex(This,fixedDocumentIndex) (This)->lpVtbl->GetDocumentIndex(This,fixedDocumentIndex)
#define IXpsSignatureBlock_GetDocumentName(This,fixedDocumentName) (This)->lpVtbl->GetDocumentName(This,fixedDocumentName)
#define IXpsSignatureBlock_CreateRequest(This,requestId,signatureRequest) (This)->lpVtbl->CreateRequest(This,requestId,signatureRequest)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureBlock_QueryInterface(IXpsSignatureBlock* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsSignatureBlock_AddRef(IXpsSignatureBlock* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsSignatureBlock_Release(IXpsSignatureBlock* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsSignatureBlock methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureBlock_GetRequests(IXpsSignatureBlock* This,IXpsSignatureRequestCollection **requests) {
    return This->lpVtbl->GetRequests(This,requests);
}
static __WIDL_INLINE HRESULT IXpsSignatureBlock_GetPartName(IXpsSignatureBlock* This,IOpcPartUri **partName) {
    return This->lpVtbl->GetPartName(This,partName);
}
static __WIDL_INLINE HRESULT IXpsSignatureBlock_GetDocumentIndex(IXpsSignatureBlock* This,UINT32 *fixedDocumentIndex) {
    return This->lpVtbl->GetDocumentIndex(This,fixedDocumentIndex);
}
static __WIDL_INLINE HRESULT IXpsSignatureBlock_GetDocumentName(IXpsSignatureBlock* This,IOpcPartUri **fixedDocumentName) {
    return This->lpVtbl->GetDocumentName(This,fixedDocumentName);
}
static __WIDL_INLINE HRESULT IXpsSignatureBlock_CreateRequest(IXpsSignatureBlock* This,LPCWSTR requestId,IXpsSignatureRequest **signatureRequest) {
    return This->lpVtbl->CreateRequest(This,requestId,signatureRequest);
}
#endif
#endif

#endif


#endif  /* __IXpsSignatureBlock_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsSignatureBlockCollection interface
 */
#ifndef __IXpsSignatureBlockCollection_INTERFACE_DEFINED__
#define __IXpsSignatureBlockCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsSignatureBlockCollection, 0x23397050, 0xfe99, 0x467a, 0x8d,0xce, 0x92,0x37,0xf0,0x74,0xff,0xe4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("23397050-fe99-467a-8dce-9237f074ffe4")
IXpsSignatureBlockCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsSignatureBlock **signatureBlock) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsSignatureBlockCollection, 0x23397050, 0xfe99, 0x467a, 0x8d,0xce, 0x92,0x37,0xf0,0x74,0xff,0xe4)
#endif
#else
typedef struct IXpsSignatureBlockCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsSignatureBlockCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsSignatureBlockCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsSignatureBlockCollection *This,
        UINT32 index,
        IXpsSignatureBlock **signatureBlock);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsSignatureBlockCollection *This,
        UINT32 index);

    END_INTERFACE
} IXpsSignatureBlockCollectionVtbl;

interface IXpsSignatureBlockCollection {
    CONST_VTBL IXpsSignatureBlockCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsSignatureBlockCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsSignatureBlockCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsSignatureBlockCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsSignatureBlockCollection methods ***/
#define IXpsSignatureBlockCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsSignatureBlockCollection_GetAt(This,index,signatureBlock) (This)->lpVtbl->GetAt(This,index,signatureBlock)
#define IXpsSignatureBlockCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureBlockCollection_QueryInterface(IXpsSignatureBlockCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsSignatureBlockCollection_AddRef(IXpsSignatureBlockCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsSignatureBlockCollection_Release(IXpsSignatureBlockCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsSignatureBlockCollection methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureBlockCollection_GetCount(IXpsSignatureBlockCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsSignatureBlockCollection_GetAt(IXpsSignatureBlockCollection* This,UINT32 index,IXpsSignatureBlock **signatureBlock) {
    return This->lpVtbl->GetAt(This,index,signatureBlock);
}
static __WIDL_INLINE HRESULT IXpsSignatureBlockCollection_RemoveAt(IXpsSignatureBlockCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
#endif
#endif

#endif


#endif  /* __IXpsSignatureBlockCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsSignatureCollection interface
 */
#ifndef __IXpsSignatureCollection_INTERFACE_DEFINED__
#define __IXpsSignatureCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsSignatureCollection, 0xa2d1d95d, 0xadd2, 0x4dff, 0xab,0x27, 0x6b,0x9c,0x64,0x5f,0xf3,0x22);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a2d1d95d-add2-4dff-ab27-6b9c645ff322")
IXpsSignatureCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsSignature **signature) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsSignatureCollection, 0xa2d1d95d, 0xadd2, 0x4dff, 0xab,0x27, 0x6b,0x9c,0x64,0x5f,0xf3,0x22)
#endif
#else
typedef struct IXpsSignatureCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsSignatureCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsSignatureCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsSignatureCollection *This,
        UINT32 index,
        IXpsSignature **signature);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsSignatureCollection *This,
        UINT32 index);

    END_INTERFACE
} IXpsSignatureCollectionVtbl;

interface IXpsSignatureCollection {
    CONST_VTBL IXpsSignatureCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsSignatureCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsSignatureCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsSignatureCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsSignatureCollection methods ***/
#define IXpsSignatureCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsSignatureCollection_GetAt(This,index,signature) (This)->lpVtbl->GetAt(This,index,signature)
#define IXpsSignatureCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureCollection_QueryInterface(IXpsSignatureCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsSignatureCollection_AddRef(IXpsSignatureCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsSignatureCollection_Release(IXpsSignatureCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsSignatureCollection methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureCollection_GetCount(IXpsSignatureCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsSignatureCollection_GetAt(IXpsSignatureCollection* This,UINT32 index,IXpsSignature **signature) {
    return This->lpVtbl->GetAt(This,index,signature);
}
static __WIDL_INLINE HRESULT IXpsSignatureCollection_RemoveAt(IXpsSignatureCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
#endif
#endif

#endif


#endif  /* __IXpsSignatureCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsSignatureManager interface
 */
#ifndef __IXpsSignatureManager_INTERFACE_DEFINED__
#define __IXpsSignatureManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsSignatureManager, 0xd3e8d338, 0xfdc4, 0x4afc, 0x80,0xb5, 0xd5,0x32,0xa1,0x78,0x2e,0xe1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d3e8d338-fdc4-4afc-80b5-d532a1782ee1")
IXpsSignatureManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE LoadPackageFile(
        LPCWSTR fileName) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadPackageStream(
        IStream *stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE Sign(
        IXpsSigningOptions *signOptions,
        const CERT_CONTEXT *x509Certificate,
        IXpsSignature **signature) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureOriginPartName(
        IOpcPartUri **signatureOriginPartName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSignatureOriginPartName(
        IOpcPartUri *signatureOriginPartName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatures(
        IXpsSignatureCollection **signatures) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSignatureBlock(
        IOpcPartUri *partName,
        UINT32 fixedDocumentIndex,
        IXpsSignatureBlock **signatureBlock) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureBlocks(
        IXpsSignatureBlockCollection **signatureBlocks) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSigningOptions(
        IXpsSigningOptions **signingOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE SavePackageToFile(
        LPCWSTR fileName,
        LPSECURITY_ATTRIBUTES securityAttributes,
        DWORD flagsAndAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE SavePackageToStream(
        IStream *stream) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsSignatureManager, 0xd3e8d338, 0xfdc4, 0x4afc, 0x80,0xb5, 0xd5,0x32,0xa1,0x78,0x2e,0xe1)
#endif
#else
typedef struct IXpsSignatureManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsSignatureManager methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadPackageFile)(
        IXpsSignatureManager *This,
        LPCWSTR fileName);

    HRESULT (STDMETHODCALLTYPE *LoadPackageStream)(
        IXpsSignatureManager *This,
        IStream *stream);

    HRESULT (STDMETHODCALLTYPE *Sign)(
        IXpsSignatureManager *This,
        IXpsSigningOptions *signOptions,
        const CERT_CONTEXT *x509Certificate,
        IXpsSignature **signature);

    HRESULT (STDMETHODCALLTYPE *GetSignatureOriginPartName)(
        IXpsSignatureManager *This,
        IOpcPartUri **signatureOriginPartName);

    HRESULT (STDMETHODCALLTYPE *SetSignatureOriginPartName)(
        IXpsSignatureManager *This,
        IOpcPartUri *signatureOriginPartName);

    HRESULT (STDMETHODCALLTYPE *GetSignatures)(
        IXpsSignatureManager *This,
        IXpsSignatureCollection **signatures);

    HRESULT (STDMETHODCALLTYPE *AddSignatureBlock)(
        IXpsSignatureManager *This,
        IOpcPartUri *partName,
        UINT32 fixedDocumentIndex,
        IXpsSignatureBlock **signatureBlock);

    HRESULT (STDMETHODCALLTYPE *GetSignatureBlocks)(
        IXpsSignatureManager *This,
        IXpsSignatureBlockCollection **signatureBlocks);

    HRESULT (STDMETHODCALLTYPE *CreateSigningOptions)(
        IXpsSignatureManager *This,
        IXpsSigningOptions **signingOptions);

    HRESULT (STDMETHODCALLTYPE *SavePackageToFile)(
        IXpsSignatureManager *This,
        LPCWSTR fileName,
        LPSECURITY_ATTRIBUTES securityAttributes,
        DWORD flagsAndAttributes);

    HRESULT (STDMETHODCALLTYPE *SavePackageToStream)(
        IXpsSignatureManager *This,
        IStream *stream);

    END_INTERFACE
} IXpsSignatureManagerVtbl;

interface IXpsSignatureManager {
    CONST_VTBL IXpsSignatureManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsSignatureManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsSignatureManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsSignatureManager_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsSignatureManager methods ***/
#define IXpsSignatureManager_LoadPackageFile(This,fileName) (This)->lpVtbl->LoadPackageFile(This,fileName)
#define IXpsSignatureManager_LoadPackageStream(This,stream) (This)->lpVtbl->LoadPackageStream(This,stream)
#define IXpsSignatureManager_Sign(This,signOptions,x509Certificate,signature) (This)->lpVtbl->Sign(This,signOptions,x509Certificate,signature)
#define IXpsSignatureManager_GetSignatureOriginPartName(This,signatureOriginPartName) (This)->lpVtbl->GetSignatureOriginPartName(This,signatureOriginPartName)
#define IXpsSignatureManager_SetSignatureOriginPartName(This,signatureOriginPartName) (This)->lpVtbl->SetSignatureOriginPartName(This,signatureOriginPartName)
#define IXpsSignatureManager_GetSignatures(This,signatures) (This)->lpVtbl->GetSignatures(This,signatures)
#define IXpsSignatureManager_AddSignatureBlock(This,partName,fixedDocumentIndex,signatureBlock) (This)->lpVtbl->AddSignatureBlock(This,partName,fixedDocumentIndex,signatureBlock)
#define IXpsSignatureManager_GetSignatureBlocks(This,signatureBlocks) (This)->lpVtbl->GetSignatureBlocks(This,signatureBlocks)
#define IXpsSignatureManager_CreateSigningOptions(This,signingOptions) (This)->lpVtbl->CreateSigningOptions(This,signingOptions)
#define IXpsSignatureManager_SavePackageToFile(This,fileName,securityAttributes,flagsAndAttributes) (This)->lpVtbl->SavePackageToFile(This,fileName,securityAttributes,flagsAndAttributes)
#define IXpsSignatureManager_SavePackageToStream(This,stream) (This)->lpVtbl->SavePackageToStream(This,stream)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureManager_QueryInterface(IXpsSignatureManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsSignatureManager_AddRef(IXpsSignatureManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsSignatureManager_Release(IXpsSignatureManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsSignatureManager methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureManager_LoadPackageFile(IXpsSignatureManager* This,LPCWSTR fileName) {
    return This->lpVtbl->LoadPackageFile(This,fileName);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_LoadPackageStream(IXpsSignatureManager* This,IStream *stream) {
    return This->lpVtbl->LoadPackageStream(This,stream);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_Sign(IXpsSignatureManager* This,IXpsSigningOptions *signOptions,const CERT_CONTEXT *x509Certificate,IXpsSignature **signature) {
    return This->lpVtbl->Sign(This,signOptions,x509Certificate,signature);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_GetSignatureOriginPartName(IXpsSignatureManager* This,IOpcPartUri **signatureOriginPartName) {
    return This->lpVtbl->GetSignatureOriginPartName(This,signatureOriginPartName);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_SetSignatureOriginPartName(IXpsSignatureManager* This,IOpcPartUri *signatureOriginPartName) {
    return This->lpVtbl->SetSignatureOriginPartName(This,signatureOriginPartName);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_GetSignatures(IXpsSignatureManager* This,IXpsSignatureCollection **signatures) {
    return This->lpVtbl->GetSignatures(This,signatures);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_AddSignatureBlock(IXpsSignatureManager* This,IOpcPartUri *partName,UINT32 fixedDocumentIndex,IXpsSignatureBlock **signatureBlock) {
    return This->lpVtbl->AddSignatureBlock(This,partName,fixedDocumentIndex,signatureBlock);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_GetSignatureBlocks(IXpsSignatureManager* This,IXpsSignatureBlockCollection **signatureBlocks) {
    return This->lpVtbl->GetSignatureBlocks(This,signatureBlocks);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_CreateSigningOptions(IXpsSignatureManager* This,IXpsSigningOptions **signingOptions) {
    return This->lpVtbl->CreateSigningOptions(This,signingOptions);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_SavePackageToFile(IXpsSignatureManager* This,LPCWSTR fileName,LPSECURITY_ATTRIBUTES securityAttributes,DWORD flagsAndAttributes) {
    return This->lpVtbl->SavePackageToFile(This,fileName,securityAttributes,flagsAndAttributes);
}
static __WIDL_INLINE HRESULT IXpsSignatureManager_SavePackageToStream(IXpsSignatureManager* This,IStream *stream) {
    return This->lpVtbl->SavePackageToStream(This,stream);
}
#endif
#endif

#endif


#endif  /* __IXpsSignatureManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsSignatureRequest interface
 */
#ifndef __IXpsSignatureRequest_INTERFACE_DEFINED__
#define __IXpsSignatureRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsSignatureRequest, 0xac58950b, 0x7208, 0x4b2d, 0xb2,0xc4, 0x95,0x10,0x83,0xd3,0xb8,0xeb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ac58950b-7208-4b2d-b2c4-951083d3b8eb")
IXpsSignatureRequest : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetIntent(
        LPWSTR *intent) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIntent(
        LPCWSTR intent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRequestedSigner(
        LPWSTR *signerName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRequestedSigner(
        LPCWSTR signerName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRequestSignByDate(
        LPWSTR *dateString) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRequestSignByDate(
        LPCWSTR dateString) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSigningLocale(
        LPWSTR *place) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSigningLocale(
        LPCWSTR place) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSpotLocation(
        INT32 *pageIndex,
        IOpcPartUri **pagePartName,
        float *x,
        float *y) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSpotLocation(
        INT32 pageIndex,
        float x,
        float y) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRequestId(
        LPWSTR *requestId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignature(
        IXpsSignature **signature) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsSignatureRequest, 0xac58950b, 0x7208, 0x4b2d, 0xb2,0xc4, 0x95,0x10,0x83,0xd3,0xb8,0xeb)
#endif
#else
typedef struct IXpsSignatureRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsSignatureRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIntent)(
        IXpsSignatureRequest *This,
        LPWSTR *intent);

    HRESULT (STDMETHODCALLTYPE *SetIntent)(
        IXpsSignatureRequest *This,
        LPCWSTR intent);

    HRESULT (STDMETHODCALLTYPE *GetRequestedSigner)(
        IXpsSignatureRequest *This,
        LPWSTR *signerName);

    HRESULT (STDMETHODCALLTYPE *SetRequestedSigner)(
        IXpsSignatureRequest *This,
        LPCWSTR signerName);

    HRESULT (STDMETHODCALLTYPE *GetRequestSignByDate)(
        IXpsSignatureRequest *This,
        LPWSTR *dateString);

    HRESULT (STDMETHODCALLTYPE *SetRequestSignByDate)(
        IXpsSignatureRequest *This,
        LPCWSTR dateString);

    HRESULT (STDMETHODCALLTYPE *GetSigningLocale)(
        IXpsSignatureRequest *This,
        LPWSTR *place);

    HRESULT (STDMETHODCALLTYPE *SetSigningLocale)(
        IXpsSignatureRequest *This,
        LPCWSTR place);

    HRESULT (STDMETHODCALLTYPE *GetSpotLocation)(
        IXpsSignatureRequest *This,
        INT32 *pageIndex,
        IOpcPartUri **pagePartName,
        float *x,
        float *y);

    HRESULT (STDMETHODCALLTYPE *SetSpotLocation)(
        IXpsSignatureRequest *This,
        INT32 pageIndex,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *GetRequestId)(
        IXpsSignatureRequest *This,
        LPWSTR *requestId);

    HRESULT (STDMETHODCALLTYPE *GetSignature)(
        IXpsSignatureRequest *This,
        IXpsSignature **signature);

    END_INTERFACE
} IXpsSignatureRequestVtbl;

interface IXpsSignatureRequest {
    CONST_VTBL IXpsSignatureRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsSignatureRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsSignatureRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsSignatureRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsSignatureRequest methods ***/
#define IXpsSignatureRequest_GetIntent(This,intent) (This)->lpVtbl->GetIntent(This,intent)
#define IXpsSignatureRequest_SetIntent(This,intent) (This)->lpVtbl->SetIntent(This,intent)
#define IXpsSignatureRequest_GetRequestedSigner(This,signerName) (This)->lpVtbl->GetRequestedSigner(This,signerName)
#define IXpsSignatureRequest_SetRequestedSigner(This,signerName) (This)->lpVtbl->SetRequestedSigner(This,signerName)
#define IXpsSignatureRequest_GetRequestSignByDate(This,dateString) (This)->lpVtbl->GetRequestSignByDate(This,dateString)
#define IXpsSignatureRequest_SetRequestSignByDate(This,dateString) (This)->lpVtbl->SetRequestSignByDate(This,dateString)
#define IXpsSignatureRequest_GetSigningLocale(This,place) (This)->lpVtbl->GetSigningLocale(This,place)
#define IXpsSignatureRequest_SetSigningLocale(This,place) (This)->lpVtbl->SetSigningLocale(This,place)
#define IXpsSignatureRequest_GetSpotLocation(This,pageIndex,pagePartName,x,y) (This)->lpVtbl->GetSpotLocation(This,pageIndex,pagePartName,x,y)
#define IXpsSignatureRequest_SetSpotLocation(This,pageIndex,x,y) (This)->lpVtbl->SetSpotLocation(This,pageIndex,x,y)
#define IXpsSignatureRequest_GetRequestId(This,requestId) (This)->lpVtbl->GetRequestId(This,requestId)
#define IXpsSignatureRequest_GetSignature(This,signature) (This)->lpVtbl->GetSignature(This,signature)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureRequest_QueryInterface(IXpsSignatureRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsSignatureRequest_AddRef(IXpsSignatureRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsSignatureRequest_Release(IXpsSignatureRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsSignatureRequest methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureRequest_GetIntent(IXpsSignatureRequest* This,LPWSTR *intent) {
    return This->lpVtbl->GetIntent(This,intent);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_SetIntent(IXpsSignatureRequest* This,LPCWSTR intent) {
    return This->lpVtbl->SetIntent(This,intent);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_GetRequestedSigner(IXpsSignatureRequest* This,LPWSTR *signerName) {
    return This->lpVtbl->GetRequestedSigner(This,signerName);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_SetRequestedSigner(IXpsSignatureRequest* This,LPCWSTR signerName) {
    return This->lpVtbl->SetRequestedSigner(This,signerName);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_GetRequestSignByDate(IXpsSignatureRequest* This,LPWSTR *dateString) {
    return This->lpVtbl->GetRequestSignByDate(This,dateString);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_SetRequestSignByDate(IXpsSignatureRequest* This,LPCWSTR dateString) {
    return This->lpVtbl->SetRequestSignByDate(This,dateString);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_GetSigningLocale(IXpsSignatureRequest* This,LPWSTR *place) {
    return This->lpVtbl->GetSigningLocale(This,place);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_SetSigningLocale(IXpsSignatureRequest* This,LPCWSTR place) {
    return This->lpVtbl->SetSigningLocale(This,place);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_GetSpotLocation(IXpsSignatureRequest* This,INT32 *pageIndex,IOpcPartUri **pagePartName,float *x,float *y) {
    return This->lpVtbl->GetSpotLocation(This,pageIndex,pagePartName,x,y);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_SetSpotLocation(IXpsSignatureRequest* This,INT32 pageIndex,float x,float y) {
    return This->lpVtbl->SetSpotLocation(This,pageIndex,x,y);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_GetRequestId(IXpsSignatureRequest* This,LPWSTR *requestId) {
    return This->lpVtbl->GetRequestId(This,requestId);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequest_GetSignature(IXpsSignatureRequest* This,IXpsSignature **signature) {
    return This->lpVtbl->GetSignature(This,signature);
}
#endif
#endif

#endif


#endif  /* __IXpsSignatureRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsSignatureRequestCollection interface
 */
#ifndef __IXpsSignatureRequestCollection_INTERFACE_DEFINED__
#define __IXpsSignatureRequestCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsSignatureRequestCollection, 0xf0253e68, 0x9f19, 0x412e, 0x9b,0x4f, 0x54,0xd3,0xb0,0xac,0x6c,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f0253e68-9f19-412e-9b4f-54d3b0ac6cd9")
IXpsSignatureRequestCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsSignatureRequest **signatureRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsSignatureRequestCollection, 0xf0253e68, 0x9f19, 0x412e, 0x9b,0x4f, 0x54,0xd3,0xb0,0xac,0x6c,0xd9)
#endif
#else
typedef struct IXpsSignatureRequestCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsSignatureRequestCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsSignatureRequestCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsSignatureRequestCollection *This,
        UINT32 index,
        IXpsSignatureRequest **signatureRequest);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsSignatureRequestCollection *This,
        UINT32 index);

    END_INTERFACE
} IXpsSignatureRequestCollectionVtbl;

interface IXpsSignatureRequestCollection {
    CONST_VTBL IXpsSignatureRequestCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsSignatureRequestCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsSignatureRequestCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsSignatureRequestCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsSignatureRequestCollection methods ***/
#define IXpsSignatureRequestCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsSignatureRequestCollection_GetAt(This,index,signatureRequest) (This)->lpVtbl->GetAt(This,index,signatureRequest)
#define IXpsSignatureRequestCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureRequestCollection_QueryInterface(IXpsSignatureRequestCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsSignatureRequestCollection_AddRef(IXpsSignatureRequestCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsSignatureRequestCollection_Release(IXpsSignatureRequestCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsSignatureRequestCollection methods ***/
static __WIDL_INLINE HRESULT IXpsSignatureRequestCollection_GetCount(IXpsSignatureRequestCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequestCollection_GetAt(IXpsSignatureRequestCollection* This,UINT32 index,IXpsSignatureRequest **signatureRequest) {
    return This->lpVtbl->GetAt(This,index,signatureRequest);
}
static __WIDL_INLINE HRESULT IXpsSignatureRequestCollection_RemoveAt(IXpsSignatureRequestCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
#endif
#endif

#endif


#endif  /* __IXpsSignatureRequestCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * XpsSignatureManager coclass
 */

DEFINE_GUID(CLSID_XpsSignatureManager, 0xb0c43320, 0x2315, 0x44a2, 0xb7,0x0a, 0x09,0x43,0xa1,0x40,0xa8,0xee);

#ifdef __cplusplus
class DECLSPEC_UUID("b0c43320-2315-44a2-b70a-0943a140a8ee") XpsSignatureManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XpsSignatureManager, 0xb0c43320, 0x2315, 0x44a2, 0xb7,0x0a, 0x09,0x43,0xa1,0x40,0xa8,0xee)
#endif
#endif

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


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __xpsdigitalsignature_h__ */
