/*** Autogenerated by WIDL 1.6 from msopc.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 __msopc_h__
#define __msopc_h__

/* Forward declarations */

#ifndef __IOpcUri_FWD_DEFINED__
#define __IOpcUri_FWD_DEFINED__
typedef interface IOpcUri IOpcUri;
#endif

#ifndef __IOpcPartUri_FWD_DEFINED__
#define __IOpcPartUri_FWD_DEFINED__
typedef interface IOpcPartUri IOpcPartUri;
#endif

#ifndef __IOpcPart_FWD_DEFINED__
#define __IOpcPart_FWD_DEFINED__
typedef interface IOpcPart IOpcPart;
#endif

#ifndef __IOpcPartEnumerator_FWD_DEFINED__
#define __IOpcPartEnumerator_FWD_DEFINED__
typedef interface IOpcPartEnumerator IOpcPartEnumerator;
#endif

#ifndef __IOpcPartSet_FWD_DEFINED__
#define __IOpcPartSet_FWD_DEFINED__
typedef interface IOpcPartSet IOpcPartSet;
#endif

#ifndef __IOpcPackage_FWD_DEFINED__
#define __IOpcPackage_FWD_DEFINED__
typedef interface IOpcPackage IOpcPackage;
#endif

#ifndef __IOpcRelationship_FWD_DEFINED__
#define __IOpcRelationship_FWD_DEFINED__
typedef interface IOpcRelationship IOpcRelationship;
#endif

#ifndef __IOpcRelationshipEnumerator_FWD_DEFINED__
#define __IOpcRelationshipEnumerator_FWD_DEFINED__
typedef interface IOpcRelationshipEnumerator IOpcRelationshipEnumerator;
#endif

#ifndef __IOpcRelationshipSelector_FWD_DEFINED__
#define __IOpcRelationshipSelector_FWD_DEFINED__
typedef interface IOpcRelationshipSelector IOpcRelationshipSelector;
#endif

#ifndef __IOpcRelationshipSet_FWD_DEFINED__
#define __IOpcRelationshipSet_FWD_DEFINED__
typedef interface IOpcRelationshipSet IOpcRelationshipSet;
#endif

#ifndef __IOpcSignatureCustomObject_FWD_DEFINED__
#define __IOpcSignatureCustomObject_FWD_DEFINED__
typedef interface IOpcSignatureCustomObject IOpcSignatureCustomObject;
#endif

#ifndef __IOpcSignatureCustomObjectEnumerator_FWD_DEFINED__
#define __IOpcSignatureCustomObjectEnumerator_FWD_DEFINED__
typedef interface IOpcSignatureCustomObjectEnumerator IOpcSignatureCustomObjectEnumerator;
#endif

#ifndef __IOpcSignaturePartReference_FWD_DEFINED__
#define __IOpcSignaturePartReference_FWD_DEFINED__
typedef interface IOpcSignaturePartReference IOpcSignaturePartReference;
#endif

#ifndef __IOpcSignaturePartReferenceEnumerator_FWD_DEFINED__
#define __IOpcSignaturePartReferenceEnumerator_FWD_DEFINED__
typedef interface IOpcSignaturePartReferenceEnumerator IOpcSignaturePartReferenceEnumerator;
#endif

#ifndef __IOpcSignatureReference_FWD_DEFINED__
#define __IOpcSignatureReference_FWD_DEFINED__
typedef interface IOpcSignatureReference IOpcSignatureReference;
#endif

#ifndef __IOpcSignatureReferenceEnumerator_FWD_DEFINED__
#define __IOpcSignatureReferenceEnumerator_FWD_DEFINED__
typedef interface IOpcSignatureReferenceEnumerator IOpcSignatureReferenceEnumerator;
#endif

#ifndef __IOpcSignatureRelationshipReferenceEnumerator_FWD_DEFINED__
#define __IOpcSignatureRelationshipReferenceEnumerator_FWD_DEFINED__
typedef interface IOpcSignatureRelationshipReferenceEnumerator IOpcSignatureRelationshipReferenceEnumerator;
#endif

#ifndef __IOpcSignatureRelationshipReference_FWD_DEFINED__
#define __IOpcSignatureRelationshipReference_FWD_DEFINED__
typedef interface IOpcSignatureRelationshipReference IOpcSignatureRelationshipReference;
#endif

#ifndef __IOpcRelationshipSelectorEnumerator_FWD_DEFINED__
#define __IOpcRelationshipSelectorEnumerator_FWD_DEFINED__
typedef interface IOpcRelationshipSelectorEnumerator IOpcRelationshipSelectorEnumerator;
#endif

#ifndef __IOpcCertificateEnumerator_FWD_DEFINED__
#define __IOpcCertificateEnumerator_FWD_DEFINED__
typedef interface IOpcCertificateEnumerator IOpcCertificateEnumerator;
#endif

#ifndef __IOpcCertificateSet_FWD_DEFINED__
#define __IOpcCertificateSet_FWD_DEFINED__
typedef interface IOpcCertificateSet IOpcCertificateSet;
#endif

#ifndef __IOpcDigitalSignatureEnumerator_FWD_DEFINED__
#define __IOpcDigitalSignatureEnumerator_FWD_DEFINED__
typedef interface IOpcDigitalSignatureEnumerator IOpcDigitalSignatureEnumerator;
#endif

#ifndef __IOpcDigitalSignatureManager_FWD_DEFINED__
#define __IOpcDigitalSignatureManager_FWD_DEFINED__
typedef interface IOpcDigitalSignatureManager IOpcDigitalSignatureManager;
#endif

#ifndef __IOpcSignaturePartReferenceSet_FWD_DEFINED__
#define __IOpcSignaturePartReferenceSet_FWD_DEFINED__
typedef interface IOpcSignaturePartReferenceSet IOpcSignaturePartReferenceSet;
#endif

#ifndef __IOpcRelationshipSelectorSet_FWD_DEFINED__
#define __IOpcRelationshipSelectorSet_FWD_DEFINED__
typedef interface IOpcRelationshipSelectorSet IOpcRelationshipSelectorSet;
#endif

#ifndef __IOpcSignatureRelationshipReferenceSet_FWD_DEFINED__
#define __IOpcSignatureRelationshipReferenceSet_FWD_DEFINED__
typedef interface IOpcSignatureRelationshipReferenceSet IOpcSignatureRelationshipReferenceSet;
#endif

#ifndef __IOpcSignatureReferenceSet_FWD_DEFINED__
#define __IOpcSignatureReferenceSet_FWD_DEFINED__
typedef interface IOpcSignatureReferenceSet IOpcSignatureReferenceSet;
#endif

#ifndef __IOpcSignatureCustomObjectSet_FWD_DEFINED__
#define __IOpcSignatureCustomObjectSet_FWD_DEFINED__
typedef interface IOpcSignatureCustomObjectSet IOpcSignatureCustomObjectSet;
#endif

#ifndef __IOpcDigitalSignature_FWD_DEFINED__
#define __IOpcDigitalSignature_FWD_DEFINED__
typedef interface IOpcDigitalSignature IOpcDigitalSignature;
#endif

#ifndef __IOpcSigningOptions_FWD_DEFINED__
#define __IOpcSigningOptions_FWD_DEFINED__
typedef interface IOpcSigningOptions IOpcSigningOptions;
#endif

#ifndef __IOpcFactory_FWD_DEFINED__
#define __IOpcFactory_FWD_DEFINED__
typedef interface IOpcFactory IOpcFactory;
#endif

#ifndef __OpcFactory_FWD_DEFINED__
#define __OpcFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class OpcFactory OpcFactory;
#else
typedef struct OpcFactory OpcFactory;
#endif /* defined __cplusplus */
#endif /* defined __OpcFactory_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <urlmon.h>
#include <wincrypt.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if NTDDI_VERSION >= 0x06010000
#ifndef __IOpcUri_FWD_DEFINED__
#define __IOpcUri_FWD_DEFINED__
typedef interface IOpcUri IOpcUri;
#endif

#ifndef __IOpcPartUri_FWD_DEFINED__
#define __IOpcPartUri_FWD_DEFINED__
typedef interface IOpcPartUri IOpcPartUri;
#endif

/*****************************************************************************
 * IOpcUri interface
 */
#ifndef __IOpcUri_INTERFACE_DEFINED__
#define __IOpcUri_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcUri, 0xbc9c1b9b, 0xd62c, 0x49eb, 0xae,0xf0, 0x3b,0x4e,0x0b,0x28,0xeb,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bc9c1b9b-d62c-49eb-aef0-3b4e0b28ebed")
IOpcUri : public IUri
{
    virtual HRESULT STDMETHODCALLTYPE GetRelationshipsPartUri(
        IOpcPartUri **relationshipPartUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRelativeUri(
        IOpcPartUri *targetPartUri,
        IUri **relativeUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE CombinePartUri(
        IUri *relativeUri,
        IOpcPartUri **combinedUri) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcUri, 0xbc9c1b9b, 0xd62c, 0x49eb, 0xae,0xf0, 0x3b,0x4e,0x0b,0x28,0xeb,0xed)
#endif
#else
typedef struct IOpcUriVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUri methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyBSTR)(
        IOpcUri* This,
        Uri_PROPERTY uriProp,
        BSTR *pbstrProperty,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetPropertyLength)(
        IOpcUri* This,
        Uri_PROPERTY uriProp,
        DWORD *pcchProperty,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetPropertyDWORD)(
        IOpcUri* This,
        Uri_PROPERTY uriProp,
        DWORD *pdwProperty,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *HasProperty)(
        IOpcUri* This,
        Uri_PROPERTY uriProp,
        WINBOOL *pfHasProperty);

    HRESULT (STDMETHODCALLTYPE *GetAbsoluteUri)(
        IOpcUri* This,
        BSTR *pbstrAbsoluteUri);

    HRESULT (STDMETHODCALLTYPE *GetAuthority)(
        IOpcUri* This,
        BSTR *pbstrAuthority);

    HRESULT (STDMETHODCALLTYPE *GetDisplayUri)(
        IOpcUri* This,
        BSTR *pbstrDisplayString);

    HRESULT (STDMETHODCALLTYPE *GetDomain)(
        IOpcUri* This,
        BSTR *pbstrDomain);

    HRESULT (STDMETHODCALLTYPE *GetExtension)(
        IOpcUri* This,
        BSTR *pbstrExtension);

    HRESULT (STDMETHODCALLTYPE *GetFragment)(
        IOpcUri* This,
        BSTR *pbstrFragment);

    HRESULT (STDMETHODCALLTYPE *GetHost)(
        IOpcUri* This,
        BSTR *pbstrHost);

    HRESULT (STDMETHODCALLTYPE *GetPassword)(
        IOpcUri* This,
        BSTR *pbstrPassword);

    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IOpcUri* This,
        BSTR *pbstrPath);

    HRESULT (STDMETHODCALLTYPE *GetPathAndQuery)(
        IOpcUri* This,
        BSTR *pbstrPathAndQuery);

    HRESULT (STDMETHODCALLTYPE *GetQuery)(
        IOpcUri* This,
        BSTR *pbstrQuery);

    HRESULT (STDMETHODCALLTYPE *GetRawUri)(
        IOpcUri* This,
        BSTR *pbstrRawUri);

    HRESULT (STDMETHODCALLTYPE *GetSchemeName)(
        IOpcUri* This,
        BSTR *pbstrSchemeName);

    HRESULT (STDMETHODCALLTYPE *GetUserInfo)(
        IOpcUri* This,
        BSTR *pbstrUserInfo);

    HRESULT (STDMETHODCALLTYPE *GetUserName)(
        IOpcUri* This,
        BSTR *pbstrUserName);

    HRESULT (STDMETHODCALLTYPE *GetHostType)(
        IOpcUri* This,
        DWORD *pdwHostType);

    HRESULT (STDMETHODCALLTYPE *GetPort)(
        IOpcUri* This,
        DWORD *pdwPort);

    HRESULT (STDMETHODCALLTYPE *GetScheme)(
        IOpcUri* This,
        DWORD *pdwScheme);

    HRESULT (STDMETHODCALLTYPE *GetZone)(
        IOpcUri* This,
        DWORD *pdwZone);

    HRESULT (STDMETHODCALLTYPE *GetProperties)(
        IOpcUri* This,
        LPDWORD pdwFlags);

    HRESULT (STDMETHODCALLTYPE *IsEqual)(
        IOpcUri* This,
        IUri *pUri,
        WINBOOL *pfEqual);

    /*** IOpcUri methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRelationshipsPartUri)(
        IOpcUri* This,
        IOpcPartUri **relationshipPartUri);

    HRESULT (STDMETHODCALLTYPE *GetRelativeUri)(
        IOpcUri* This,
        IOpcPartUri *targetPartUri,
        IUri **relativeUri);

    HRESULT (STDMETHODCALLTYPE *CombinePartUri)(
        IOpcUri* This,
        IUri *relativeUri,
        IOpcPartUri **combinedUri);

    END_INTERFACE
} IOpcUriVtbl;
interface IOpcUri {
    CONST_VTBL IOpcUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcUri_Release(This) (This)->lpVtbl->Release(This)
/*** IUri methods ***/
#define IOpcUri_GetPropertyBSTR(This,uriProp,pbstrProperty,dwFlags) (This)->lpVtbl->GetPropertyBSTR(This,uriProp,pbstrProperty,dwFlags)
#define IOpcUri_GetPropertyLength(This,uriProp,pcchProperty,dwFlags) (This)->lpVtbl->GetPropertyLength(This,uriProp,pcchProperty,dwFlags)
#define IOpcUri_GetPropertyDWORD(This,uriProp,pdwProperty,dwFlags) (This)->lpVtbl->GetPropertyDWORD(This,uriProp,pdwProperty,dwFlags)
#define IOpcUri_HasProperty(This,uriProp,pfHasProperty) (This)->lpVtbl->HasProperty(This,uriProp,pfHasProperty)
#define IOpcUri_GetAbsoluteUri(This,pbstrAbsoluteUri) (This)->lpVtbl->GetAbsoluteUri(This,pbstrAbsoluteUri)
#define IOpcUri_GetAuthority(This,pbstrAuthority) (This)->lpVtbl->GetAuthority(This,pbstrAuthority)
#define IOpcUri_GetDisplayUri(This,pbstrDisplayString) (This)->lpVtbl->GetDisplayUri(This,pbstrDisplayString)
#define IOpcUri_GetDomain(This,pbstrDomain) (This)->lpVtbl->GetDomain(This,pbstrDomain)
#define IOpcUri_GetExtension(This,pbstrExtension) (This)->lpVtbl->GetExtension(This,pbstrExtension)
#define IOpcUri_GetFragment(This,pbstrFragment) (This)->lpVtbl->GetFragment(This,pbstrFragment)
#define IOpcUri_GetHost(This,pbstrHost) (This)->lpVtbl->GetHost(This,pbstrHost)
#define IOpcUri_GetPassword(This,pbstrPassword) (This)->lpVtbl->GetPassword(This,pbstrPassword)
#define IOpcUri_GetPath(This,pbstrPath) (This)->lpVtbl->GetPath(This,pbstrPath)
#define IOpcUri_GetPathAndQuery(This,pbstrPathAndQuery) (This)->lpVtbl->GetPathAndQuery(This,pbstrPathAndQuery)
#define IOpcUri_GetQuery(This,pbstrQuery) (This)->lpVtbl->GetQuery(This,pbstrQuery)
#define IOpcUri_GetRawUri(This,pbstrRawUri) (This)->lpVtbl->GetRawUri(This,pbstrRawUri)
#define IOpcUri_GetSchemeName(This,pbstrSchemeName) (This)->lpVtbl->GetSchemeName(This,pbstrSchemeName)
#define IOpcUri_GetUserInfo(This,pbstrUserInfo) (This)->lpVtbl->GetUserInfo(This,pbstrUserInfo)
#define IOpcUri_GetUserName(This,pbstrUserName) (This)->lpVtbl->GetUserName(This,pbstrUserName)
#define IOpcUri_GetHostType(This,pdwHostType) (This)->lpVtbl->GetHostType(This,pdwHostType)
#define IOpcUri_GetPort(This,pdwPort) (This)->lpVtbl->GetPort(This,pdwPort)
#define IOpcUri_GetScheme(This,pdwScheme) (This)->lpVtbl->GetScheme(This,pdwScheme)
#define IOpcUri_GetZone(This,pdwZone) (This)->lpVtbl->GetZone(This,pdwZone)
#define IOpcUri_GetProperties(This,pdwFlags) (This)->lpVtbl->GetProperties(This,pdwFlags)
#define IOpcUri_IsEqual(This,pUri,pfEqual) (This)->lpVtbl->IsEqual(This,pUri,pfEqual)
/*** IOpcUri methods ***/
#define IOpcUri_GetRelationshipsPartUri(This,relationshipPartUri) (This)->lpVtbl->GetRelationshipsPartUri(This,relationshipPartUri)
#define IOpcUri_GetRelativeUri(This,targetPartUri,relativeUri) (This)->lpVtbl->GetRelativeUri(This,targetPartUri,relativeUri)
#define IOpcUri_CombinePartUri(This,relativeUri,combinedUri) (This)->lpVtbl->CombinePartUri(This,relativeUri,combinedUri)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcUri_QueryInterface(IOpcUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcUri_AddRef(IOpcUri* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcUri_Release(IOpcUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IUri methods ***/
static FORCEINLINE HRESULT IOpcUri_GetPropertyBSTR(IOpcUri* This,Uri_PROPERTY uriProp,BSTR *pbstrProperty,DWORD dwFlags) {
    return This->lpVtbl->GetPropertyBSTR(This,uriProp,pbstrProperty,dwFlags);
}
static FORCEINLINE HRESULT IOpcUri_GetPropertyLength(IOpcUri* This,Uri_PROPERTY uriProp,DWORD *pcchProperty,DWORD dwFlags) {
    return This->lpVtbl->GetPropertyLength(This,uriProp,pcchProperty,dwFlags);
}
static FORCEINLINE HRESULT IOpcUri_GetPropertyDWORD(IOpcUri* This,Uri_PROPERTY uriProp,DWORD *pdwProperty,DWORD dwFlags) {
    return This->lpVtbl->GetPropertyDWORD(This,uriProp,pdwProperty,dwFlags);
}
static FORCEINLINE HRESULT IOpcUri_HasProperty(IOpcUri* This,Uri_PROPERTY uriProp,WINBOOL *pfHasProperty) {
    return This->lpVtbl->HasProperty(This,uriProp,pfHasProperty);
}
static FORCEINLINE HRESULT IOpcUri_GetAbsoluteUri(IOpcUri* This,BSTR *pbstrAbsoluteUri) {
    return This->lpVtbl->GetAbsoluteUri(This,pbstrAbsoluteUri);
}
static FORCEINLINE HRESULT IOpcUri_GetAuthority(IOpcUri* This,BSTR *pbstrAuthority) {
    return This->lpVtbl->GetAuthority(This,pbstrAuthority);
}
static FORCEINLINE HRESULT IOpcUri_GetDisplayUri(IOpcUri* This,BSTR *pbstrDisplayString) {
    return This->lpVtbl->GetDisplayUri(This,pbstrDisplayString);
}
static FORCEINLINE HRESULT IOpcUri_GetDomain(IOpcUri* This,BSTR *pbstrDomain) {
    return This->lpVtbl->GetDomain(This,pbstrDomain);
}
static FORCEINLINE HRESULT IOpcUri_GetExtension(IOpcUri* This,BSTR *pbstrExtension) {
    return This->lpVtbl->GetExtension(This,pbstrExtension);
}
static FORCEINLINE HRESULT IOpcUri_GetFragment(IOpcUri* This,BSTR *pbstrFragment) {
    return This->lpVtbl->GetFragment(This,pbstrFragment);
}
static FORCEINLINE HRESULT IOpcUri_GetHost(IOpcUri* This,BSTR *pbstrHost) {
    return This->lpVtbl->GetHost(This,pbstrHost);
}
static FORCEINLINE HRESULT IOpcUri_GetPassword(IOpcUri* This,BSTR *pbstrPassword) {
    return This->lpVtbl->GetPassword(This,pbstrPassword);
}
static FORCEINLINE HRESULT IOpcUri_GetPath(IOpcUri* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetPath(This,pbstrPath);
}
static FORCEINLINE HRESULT IOpcUri_GetPathAndQuery(IOpcUri* This,BSTR *pbstrPathAndQuery) {
    return This->lpVtbl->GetPathAndQuery(This,pbstrPathAndQuery);
}
static FORCEINLINE HRESULT IOpcUri_GetQuery(IOpcUri* This,BSTR *pbstrQuery) {
    return This->lpVtbl->GetQuery(This,pbstrQuery);
}
static FORCEINLINE HRESULT IOpcUri_GetRawUri(IOpcUri* This,BSTR *pbstrRawUri) {
    return This->lpVtbl->GetRawUri(This,pbstrRawUri);
}
static FORCEINLINE HRESULT IOpcUri_GetSchemeName(IOpcUri* This,BSTR *pbstrSchemeName) {
    return This->lpVtbl->GetSchemeName(This,pbstrSchemeName);
}
static FORCEINLINE HRESULT IOpcUri_GetUserInfo(IOpcUri* This,BSTR *pbstrUserInfo) {
    return This->lpVtbl->GetUserInfo(This,pbstrUserInfo);
}
static FORCEINLINE HRESULT IOpcUri_GetUserName(IOpcUri* This,BSTR *pbstrUserName) {
    return This->lpVtbl->GetUserName(This,pbstrUserName);
}
static FORCEINLINE HRESULT IOpcUri_GetHostType(IOpcUri* This,DWORD *pdwHostType) {
    return This->lpVtbl->GetHostType(This,pdwHostType);
}
static FORCEINLINE HRESULT IOpcUri_GetPort(IOpcUri* This,DWORD *pdwPort) {
    return This->lpVtbl->GetPort(This,pdwPort);
}
static FORCEINLINE HRESULT IOpcUri_GetScheme(IOpcUri* This,DWORD *pdwScheme) {
    return This->lpVtbl->GetScheme(This,pdwScheme);
}
static FORCEINLINE HRESULT IOpcUri_GetZone(IOpcUri* This,DWORD *pdwZone) {
    return This->lpVtbl->GetZone(This,pdwZone);
}
static FORCEINLINE HRESULT IOpcUri_GetProperties(IOpcUri* This,LPDWORD pdwFlags) {
    return This->lpVtbl->GetProperties(This,pdwFlags);
}
static FORCEINLINE HRESULT IOpcUri_IsEqual(IOpcUri* This,IUri *pUri,WINBOOL *pfEqual) {
    return This->lpVtbl->IsEqual(This,pUri,pfEqual);
}
/*** IOpcUri methods ***/
static FORCEINLINE HRESULT IOpcUri_GetRelationshipsPartUri(IOpcUri* This,IOpcPartUri **relationshipPartUri) {
    return This->lpVtbl->GetRelationshipsPartUri(This,relationshipPartUri);
}
static FORCEINLINE HRESULT IOpcUri_GetRelativeUri(IOpcUri* This,IOpcPartUri *targetPartUri,IUri **relativeUri) {
    return This->lpVtbl->GetRelativeUri(This,targetPartUri,relativeUri);
}
static FORCEINLINE HRESULT IOpcUri_CombinePartUri(IOpcUri* This,IUri *relativeUri,IOpcPartUri **combinedUri) {
    return This->lpVtbl->CombinePartUri(This,relativeUri,combinedUri);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcUri_GetRelationshipsPartUri_Proxy(
    IOpcUri* This,
    IOpcPartUri **relationshipPartUri);
void __RPC_STUB IOpcUri_GetRelationshipsPartUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcUri_GetRelativeUri_Proxy(
    IOpcUri* This,
    IOpcPartUri *targetPartUri,
    IUri **relativeUri);
void __RPC_STUB IOpcUri_GetRelativeUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcUri_CombinePartUri_Proxy(
    IOpcUri* This,
    IUri *relativeUri,
    IOpcPartUri **combinedUri);
void __RPC_STUB IOpcUri_CombinePartUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcUri_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcPartUri interface
 */
#ifndef __IOpcPartUri_INTERFACE_DEFINED__
#define __IOpcPartUri_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcPartUri, 0x7d3babe7, 0x88b2, 0x46ba, 0x85,0xcb, 0x42,0x03,0xcb,0x01,0x6c,0x87);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7d3babe7-88b2-46ba-85cb-4203cb016c87")
IOpcPartUri : public IOpcUri
{
    virtual HRESULT STDMETHODCALLTYPE ComparePartUri(
        IOpcPartUri *partUri,
        INT32 *comparisonResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSourceUri(
        IOpcUri **sourceUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRelationshipsPartUri(
        WINBOOL *isRelationshipUri) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcPartUri, 0x7d3babe7, 0x88b2, 0x46ba, 0x85,0xcb, 0x42,0x03,0xcb,0x01,0x6c,0x87)
#endif
#else
typedef struct IOpcPartUriVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUri methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyBSTR)(
        IOpcPartUri* This,
        Uri_PROPERTY uriProp,
        BSTR *pbstrProperty,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetPropertyLength)(
        IOpcPartUri* This,
        Uri_PROPERTY uriProp,
        DWORD *pcchProperty,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetPropertyDWORD)(
        IOpcPartUri* This,
        Uri_PROPERTY uriProp,
        DWORD *pdwProperty,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *HasProperty)(
        IOpcPartUri* This,
        Uri_PROPERTY uriProp,
        WINBOOL *pfHasProperty);

    HRESULT (STDMETHODCALLTYPE *GetAbsoluteUri)(
        IOpcPartUri* This,
        BSTR *pbstrAbsoluteUri);

    HRESULT (STDMETHODCALLTYPE *GetAuthority)(
        IOpcPartUri* This,
        BSTR *pbstrAuthority);

    HRESULT (STDMETHODCALLTYPE *GetDisplayUri)(
        IOpcPartUri* This,
        BSTR *pbstrDisplayString);

    HRESULT (STDMETHODCALLTYPE *GetDomain)(
        IOpcPartUri* This,
        BSTR *pbstrDomain);

    HRESULT (STDMETHODCALLTYPE *GetExtension)(
        IOpcPartUri* This,
        BSTR *pbstrExtension);

    HRESULT (STDMETHODCALLTYPE *GetFragment)(
        IOpcPartUri* This,
        BSTR *pbstrFragment);

    HRESULT (STDMETHODCALLTYPE *GetHost)(
        IOpcPartUri* This,
        BSTR *pbstrHost);

    HRESULT (STDMETHODCALLTYPE *GetPassword)(
        IOpcPartUri* This,
        BSTR *pbstrPassword);

    HRESULT (STDMETHODCALLTYPE *GetPath)(
        IOpcPartUri* This,
        BSTR *pbstrPath);

    HRESULT (STDMETHODCALLTYPE *GetPathAndQuery)(
        IOpcPartUri* This,
        BSTR *pbstrPathAndQuery);

    HRESULT (STDMETHODCALLTYPE *GetQuery)(
        IOpcPartUri* This,
        BSTR *pbstrQuery);

    HRESULT (STDMETHODCALLTYPE *GetRawUri)(
        IOpcPartUri* This,
        BSTR *pbstrRawUri);

    HRESULT (STDMETHODCALLTYPE *GetSchemeName)(
        IOpcPartUri* This,
        BSTR *pbstrSchemeName);

    HRESULT (STDMETHODCALLTYPE *GetUserInfo)(
        IOpcPartUri* This,
        BSTR *pbstrUserInfo);

    HRESULT (STDMETHODCALLTYPE *GetUserName)(
        IOpcPartUri* This,
        BSTR *pbstrUserName);

    HRESULT (STDMETHODCALLTYPE *GetHostType)(
        IOpcPartUri* This,
        DWORD *pdwHostType);

    HRESULT (STDMETHODCALLTYPE *GetPort)(
        IOpcPartUri* This,
        DWORD *pdwPort);

    HRESULT (STDMETHODCALLTYPE *GetScheme)(
        IOpcPartUri* This,
        DWORD *pdwScheme);

    HRESULT (STDMETHODCALLTYPE *GetZone)(
        IOpcPartUri* This,
        DWORD *pdwZone);

    HRESULT (STDMETHODCALLTYPE *GetProperties)(
        IOpcPartUri* This,
        LPDWORD pdwFlags);

    HRESULT (STDMETHODCALLTYPE *IsEqual)(
        IOpcPartUri* This,
        IUri *pUri,
        WINBOOL *pfEqual);

    /*** IOpcUri methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRelationshipsPartUri)(
        IOpcPartUri* This,
        IOpcPartUri **relationshipPartUri);

    HRESULT (STDMETHODCALLTYPE *GetRelativeUri)(
        IOpcPartUri* This,
        IOpcPartUri *targetPartUri,
        IUri **relativeUri);

    HRESULT (STDMETHODCALLTYPE *CombinePartUri)(
        IOpcPartUri* This,
        IUri *relativeUri,
        IOpcPartUri **combinedUri);

    /*** IOpcPartUri methods ***/
    HRESULT (STDMETHODCALLTYPE *ComparePartUri)(
        IOpcPartUri* This,
        IOpcPartUri *partUri,
        INT32 *comparisonResult);

    HRESULT (STDMETHODCALLTYPE *GetSourceUri)(
        IOpcPartUri* This,
        IOpcUri **sourceUri);

    HRESULT (STDMETHODCALLTYPE *IsRelationshipsPartUri)(
        IOpcPartUri* This,
        WINBOOL *isRelationshipUri);

    END_INTERFACE
} IOpcPartUriVtbl;
interface IOpcPartUri {
    CONST_VTBL IOpcPartUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcPartUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcPartUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcPartUri_Release(This) (This)->lpVtbl->Release(This)
/*** IUri methods ***/
#define IOpcPartUri_GetPropertyBSTR(This,uriProp,pbstrProperty,dwFlags) (This)->lpVtbl->GetPropertyBSTR(This,uriProp,pbstrProperty,dwFlags)
#define IOpcPartUri_GetPropertyLength(This,uriProp,pcchProperty,dwFlags) (This)->lpVtbl->GetPropertyLength(This,uriProp,pcchProperty,dwFlags)
#define IOpcPartUri_GetPropertyDWORD(This,uriProp,pdwProperty,dwFlags) (This)->lpVtbl->GetPropertyDWORD(This,uriProp,pdwProperty,dwFlags)
#define IOpcPartUri_HasProperty(This,uriProp,pfHasProperty) (This)->lpVtbl->HasProperty(This,uriProp,pfHasProperty)
#define IOpcPartUri_GetAbsoluteUri(This,pbstrAbsoluteUri) (This)->lpVtbl->GetAbsoluteUri(This,pbstrAbsoluteUri)
#define IOpcPartUri_GetAuthority(This,pbstrAuthority) (This)->lpVtbl->GetAuthority(This,pbstrAuthority)
#define IOpcPartUri_GetDisplayUri(This,pbstrDisplayString) (This)->lpVtbl->GetDisplayUri(This,pbstrDisplayString)
#define IOpcPartUri_GetDomain(This,pbstrDomain) (This)->lpVtbl->GetDomain(This,pbstrDomain)
#define IOpcPartUri_GetExtension(This,pbstrExtension) (This)->lpVtbl->GetExtension(This,pbstrExtension)
#define IOpcPartUri_GetFragment(This,pbstrFragment) (This)->lpVtbl->GetFragment(This,pbstrFragment)
#define IOpcPartUri_GetHost(This,pbstrHost) (This)->lpVtbl->GetHost(This,pbstrHost)
#define IOpcPartUri_GetPassword(This,pbstrPassword) (This)->lpVtbl->GetPassword(This,pbstrPassword)
#define IOpcPartUri_GetPath(This,pbstrPath) (This)->lpVtbl->GetPath(This,pbstrPath)
#define IOpcPartUri_GetPathAndQuery(This,pbstrPathAndQuery) (This)->lpVtbl->GetPathAndQuery(This,pbstrPathAndQuery)
#define IOpcPartUri_GetQuery(This,pbstrQuery) (This)->lpVtbl->GetQuery(This,pbstrQuery)
#define IOpcPartUri_GetRawUri(This,pbstrRawUri) (This)->lpVtbl->GetRawUri(This,pbstrRawUri)
#define IOpcPartUri_GetSchemeName(This,pbstrSchemeName) (This)->lpVtbl->GetSchemeName(This,pbstrSchemeName)
#define IOpcPartUri_GetUserInfo(This,pbstrUserInfo) (This)->lpVtbl->GetUserInfo(This,pbstrUserInfo)
#define IOpcPartUri_GetUserName(This,pbstrUserName) (This)->lpVtbl->GetUserName(This,pbstrUserName)
#define IOpcPartUri_GetHostType(This,pdwHostType) (This)->lpVtbl->GetHostType(This,pdwHostType)
#define IOpcPartUri_GetPort(This,pdwPort) (This)->lpVtbl->GetPort(This,pdwPort)
#define IOpcPartUri_GetScheme(This,pdwScheme) (This)->lpVtbl->GetScheme(This,pdwScheme)
#define IOpcPartUri_GetZone(This,pdwZone) (This)->lpVtbl->GetZone(This,pdwZone)
#define IOpcPartUri_GetProperties(This,pdwFlags) (This)->lpVtbl->GetProperties(This,pdwFlags)
#define IOpcPartUri_IsEqual(This,pUri,pfEqual) (This)->lpVtbl->IsEqual(This,pUri,pfEqual)
/*** IOpcUri methods ***/
#define IOpcPartUri_GetRelationshipsPartUri(This,relationshipPartUri) (This)->lpVtbl->GetRelationshipsPartUri(This,relationshipPartUri)
#define IOpcPartUri_GetRelativeUri(This,targetPartUri,relativeUri) (This)->lpVtbl->GetRelativeUri(This,targetPartUri,relativeUri)
#define IOpcPartUri_CombinePartUri(This,relativeUri,combinedUri) (This)->lpVtbl->CombinePartUri(This,relativeUri,combinedUri)
/*** IOpcPartUri methods ***/
#define IOpcPartUri_ComparePartUri(This,partUri,comparisonResult) (This)->lpVtbl->ComparePartUri(This,partUri,comparisonResult)
#define IOpcPartUri_GetSourceUri(This,sourceUri) (This)->lpVtbl->GetSourceUri(This,sourceUri)
#define IOpcPartUri_IsRelationshipsPartUri(This,isRelationshipUri) (This)->lpVtbl->IsRelationshipsPartUri(This,isRelationshipUri)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcPartUri_QueryInterface(IOpcPartUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcPartUri_AddRef(IOpcPartUri* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcPartUri_Release(IOpcPartUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IUri methods ***/
static FORCEINLINE HRESULT IOpcPartUri_GetPropertyBSTR(IOpcPartUri* This,Uri_PROPERTY uriProp,BSTR *pbstrProperty,DWORD dwFlags) {
    return This->lpVtbl->GetPropertyBSTR(This,uriProp,pbstrProperty,dwFlags);
}
static FORCEINLINE HRESULT IOpcPartUri_GetPropertyLength(IOpcPartUri* This,Uri_PROPERTY uriProp,DWORD *pcchProperty,DWORD dwFlags) {
    return This->lpVtbl->GetPropertyLength(This,uriProp,pcchProperty,dwFlags);
}
static FORCEINLINE HRESULT IOpcPartUri_GetPropertyDWORD(IOpcPartUri* This,Uri_PROPERTY uriProp,DWORD *pdwProperty,DWORD dwFlags) {
    return This->lpVtbl->GetPropertyDWORD(This,uriProp,pdwProperty,dwFlags);
}
static FORCEINLINE HRESULT IOpcPartUri_HasProperty(IOpcPartUri* This,Uri_PROPERTY uriProp,WINBOOL *pfHasProperty) {
    return This->lpVtbl->HasProperty(This,uriProp,pfHasProperty);
}
static FORCEINLINE HRESULT IOpcPartUri_GetAbsoluteUri(IOpcPartUri* This,BSTR *pbstrAbsoluteUri) {
    return This->lpVtbl->GetAbsoluteUri(This,pbstrAbsoluteUri);
}
static FORCEINLINE HRESULT IOpcPartUri_GetAuthority(IOpcPartUri* This,BSTR *pbstrAuthority) {
    return This->lpVtbl->GetAuthority(This,pbstrAuthority);
}
static FORCEINLINE HRESULT IOpcPartUri_GetDisplayUri(IOpcPartUri* This,BSTR *pbstrDisplayString) {
    return This->lpVtbl->GetDisplayUri(This,pbstrDisplayString);
}
static FORCEINLINE HRESULT IOpcPartUri_GetDomain(IOpcPartUri* This,BSTR *pbstrDomain) {
    return This->lpVtbl->GetDomain(This,pbstrDomain);
}
static FORCEINLINE HRESULT IOpcPartUri_GetExtension(IOpcPartUri* This,BSTR *pbstrExtension) {
    return This->lpVtbl->GetExtension(This,pbstrExtension);
}
static FORCEINLINE HRESULT IOpcPartUri_GetFragment(IOpcPartUri* This,BSTR *pbstrFragment) {
    return This->lpVtbl->GetFragment(This,pbstrFragment);
}
static FORCEINLINE HRESULT IOpcPartUri_GetHost(IOpcPartUri* This,BSTR *pbstrHost) {
    return This->lpVtbl->GetHost(This,pbstrHost);
}
static FORCEINLINE HRESULT IOpcPartUri_GetPassword(IOpcPartUri* This,BSTR *pbstrPassword) {
    return This->lpVtbl->GetPassword(This,pbstrPassword);
}
static FORCEINLINE HRESULT IOpcPartUri_GetPath(IOpcPartUri* This,BSTR *pbstrPath) {
    return This->lpVtbl->GetPath(This,pbstrPath);
}
static FORCEINLINE HRESULT IOpcPartUri_GetPathAndQuery(IOpcPartUri* This,BSTR *pbstrPathAndQuery) {
    return This->lpVtbl->GetPathAndQuery(This,pbstrPathAndQuery);
}
static FORCEINLINE HRESULT IOpcPartUri_GetQuery(IOpcPartUri* This,BSTR *pbstrQuery) {
    return This->lpVtbl->GetQuery(This,pbstrQuery);
}
static FORCEINLINE HRESULT IOpcPartUri_GetRawUri(IOpcPartUri* This,BSTR *pbstrRawUri) {
    return This->lpVtbl->GetRawUri(This,pbstrRawUri);
}
static FORCEINLINE HRESULT IOpcPartUri_GetSchemeName(IOpcPartUri* This,BSTR *pbstrSchemeName) {
    return This->lpVtbl->GetSchemeName(This,pbstrSchemeName);
}
static FORCEINLINE HRESULT IOpcPartUri_GetUserInfo(IOpcPartUri* This,BSTR *pbstrUserInfo) {
    return This->lpVtbl->GetUserInfo(This,pbstrUserInfo);
}
static FORCEINLINE HRESULT IOpcPartUri_GetUserName(IOpcPartUri* This,BSTR *pbstrUserName) {
    return This->lpVtbl->GetUserName(This,pbstrUserName);
}
static FORCEINLINE HRESULT IOpcPartUri_GetHostType(IOpcPartUri* This,DWORD *pdwHostType) {
    return This->lpVtbl->GetHostType(This,pdwHostType);
}
static FORCEINLINE HRESULT IOpcPartUri_GetPort(IOpcPartUri* This,DWORD *pdwPort) {
    return This->lpVtbl->GetPort(This,pdwPort);
}
static FORCEINLINE HRESULT IOpcPartUri_GetScheme(IOpcPartUri* This,DWORD *pdwScheme) {
    return This->lpVtbl->GetScheme(This,pdwScheme);
}
static FORCEINLINE HRESULT IOpcPartUri_GetZone(IOpcPartUri* This,DWORD *pdwZone) {
    return This->lpVtbl->GetZone(This,pdwZone);
}
static FORCEINLINE HRESULT IOpcPartUri_GetProperties(IOpcPartUri* This,LPDWORD pdwFlags) {
    return This->lpVtbl->GetProperties(This,pdwFlags);
}
static FORCEINLINE HRESULT IOpcPartUri_IsEqual(IOpcPartUri* This,IUri *pUri,WINBOOL *pfEqual) {
    return This->lpVtbl->IsEqual(This,pUri,pfEqual);
}
/*** IOpcUri methods ***/
static FORCEINLINE HRESULT IOpcPartUri_GetRelationshipsPartUri(IOpcPartUri* This,IOpcPartUri **relationshipPartUri) {
    return This->lpVtbl->GetRelationshipsPartUri(This,relationshipPartUri);
}
static FORCEINLINE HRESULT IOpcPartUri_GetRelativeUri(IOpcPartUri* This,IOpcPartUri *targetPartUri,IUri **relativeUri) {
    return This->lpVtbl->GetRelativeUri(This,targetPartUri,relativeUri);
}
static FORCEINLINE HRESULT IOpcPartUri_CombinePartUri(IOpcPartUri* This,IUri *relativeUri,IOpcPartUri **combinedUri) {
    return This->lpVtbl->CombinePartUri(This,relativeUri,combinedUri);
}
/*** IOpcPartUri methods ***/
static FORCEINLINE HRESULT IOpcPartUri_ComparePartUri(IOpcPartUri* This,IOpcPartUri *partUri,INT32 *comparisonResult) {
    return This->lpVtbl->ComparePartUri(This,partUri,comparisonResult);
}
static FORCEINLINE HRESULT IOpcPartUri_GetSourceUri(IOpcPartUri* This,IOpcUri **sourceUri) {
    return This->lpVtbl->GetSourceUri(This,sourceUri);
}
static FORCEINLINE HRESULT IOpcPartUri_IsRelationshipsPartUri(IOpcPartUri* This,WINBOOL *isRelationshipUri) {
    return This->lpVtbl->IsRelationshipsPartUri(This,isRelationshipUri);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcPartUri_ComparePartUri_Proxy(
    IOpcPartUri* This,
    IOpcPartUri *partUri,
    INT32 *comparisonResult);
void __RPC_STUB IOpcPartUri_ComparePartUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartUri_GetSourceUri_Proxy(
    IOpcPartUri* This,
    IOpcUri **sourceUri);
void __RPC_STUB IOpcPartUri_GetSourceUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartUri_IsRelationshipsPartUri_Proxy(
    IOpcPartUri* This,
    WINBOOL *isRelationshipUri);
void __RPC_STUB IOpcPartUri_IsRelationshipsPartUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcPartUri_INTERFACE_DEFINED__ */

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#define IS_OPC_CONFORMANCE_ERROR(x) (((x) & 0x1ffff000) == (0x0000 + (FACILITY_OPC << 16)))
#define IS_ZIP_CONFORMANCE_ERROR(x) (((x) & 0x1ffff000) == (0x1000 + (FACILITY_OPC << 16)))
#define OPC_E_NONCONFORMING_URI MAKE_HRESULT(1, FACILITY_OPC, 0x1)
#define OPC_E_RELATIVE_URI_REQUIRED MAKE_HRESULT(1, FACILITY_OPC, 0x2)
#define OPC_E_RELATIONSHIP_URI_REQUIRED MAKE_HRESULT(1, FACILITY_OPC, 0x3)
#define OPC_E_PART_CANNOT_BE_DIRECTORY MAKE_HRESULT(1, FACILITY_OPC, 0x4)
#define OPC_E_UNEXPECTED_CONTENT_TYPE MAKE_HRESULT(1, FACILITY_OPC, 0x5)
#define OPC_E_INVALID_CONTENT_TYPE_XML MAKE_HRESULT(1, FACILITY_OPC, 0x6)
#define OPC_E_MISSING_CONTENT_TYPES MAKE_HRESULT(1, FACILITY_OPC, 0x7)
#define OPC_E_NONCONFORMING_CONTENT_TYPES_XML MAKE_HRESULT(1, FACILITY_OPC, 0x8)
#define OPC_E_NONCONFORMING_RELS_XML MAKE_HRESULT(1, FACILITY_OPC, 0x9)
#define OPC_E_INVALID_RELS_XML MAKE_HRESULT(1, FACILITY_OPC, 0xa)
#define OPC_E_DUPLICATE_PART MAKE_HRESULT(1, FACILITY_OPC, 0xb)
#define OPC_E_INVALID_OVERRIDE_PART_NAME MAKE_HRESULT(1, FACILITY_OPC, 0xc)
#define OPC_E_DUPLICATE_OVERRIDE_PART MAKE_HRESULT(1, FACILITY_OPC, 0xd)
#define OPC_E_INVALID_DEFAULT_EXTENSION MAKE_HRESULT(1, FACILITY_OPC, 0xe)
#define OPC_E_DUPLICATE_DEFAULT_EXTENSION MAKE_HRESULT(1, FACILITY_OPC, 0xf)
#define OPC_E_INVALID_RELATIONSHIP_ID MAKE_HRESULT(1, FACILITY_OPC, 0x10)
#define OPC_E_INVALID_RELATIONSHIP_TYPE MAKE_HRESULT(1, FACILITY_OPC, 0x11)
#define OPC_E_INVALID_RELATIONSHIP_TARGET MAKE_HRESULT(1, FACILITY_OPC, 0x12)
#define OPC_E_DUPLICATE_RELATIONSHIP MAKE_HRESULT(1, FACILITY_OPC, 0x13)
#define OPC_E_CONFLICTING_SETTINGS MAKE_HRESULT(1, FACILITY_OPC, 0x14)
#define OPC_E_DUPLICATE_PIECE MAKE_HRESULT(1, FACILITY_OPC, 0x15)
#define OPC_E_INVALID_PIECE MAKE_HRESULT(1, FACILITY_OPC, 0x16)
#define OPC_E_MISSING_PIECE MAKE_HRESULT(1, FACILITY_OPC, 0x17)
#define OPC_E_NO_SUCH_PART MAKE_HRESULT(1, FACILITY_OPC, 0x18)
#define OPC_E_DS_SIGNATURE_CORRUPT MAKE_HRESULT(1, FACILITY_OPC, 0x19)
#define OPC_E_DS_DIGEST_VALUE_ERROR MAKE_HRESULT(1, FACILITY_OPC, 0x1a)
#define OPC_E_DS_DUPLICATE_SIGNATURE_ORIGIN_RELATIONSHIP MAKE_HRESULT(1, FACILITY_OPC, 0x1b)
#define OPC_E_DS_INVALID_SIGNATURE_ORIGIN_RELATIONSHIP MAKE_HRESULT(1, FACILITY_OPC, 0x1c)
#define OPC_E_DS_INVALID_CERTIFICATE_RELATIONSHIP MAKE_HRESULT(1, FACILITY_OPC, 0x1d)
#define OPC_E_DS_EXTERNAL_SIGNATURE MAKE_HRESULT(1, FACILITY_OPC, 0x1e)
#define OPC_E_DS_MISSING_SIGNATURE_ORIGIN_PART MAKE_HRESULT(1, FACILITY_OPC, 0x1f)
#define OPC_E_DS_MISSING_SIGNATURE_PART MAKE_HRESULT(1, FACILITY_OPC, 0x20)
#define OPC_E_DS_INVALID_RELATIONSHIP_TRANSFORM_XML MAKE_HRESULT(1, FACILITY_OPC, 0x21)
#define OPC_E_DS_INVALID_CANONICALIZATION_METHOD MAKE_HRESULT(1, FACILITY_OPC, 0x22)
#define OPC_E_DS_INVALID_RELATIONSHIPS_SIGNING_OPTION MAKE_HRESULT(1, FACILITY_OPC, 0x23)
#define OPC_E_DS_INVALID_OPC_SIGNATURE_TIME_FORMAT MAKE_HRESULT(1, FACILITY_OPC, 0x24)
#define OPC_E_DS_PACKAGE_REFERENCE_URI_RESERVED MAKE_HRESULT(1, FACILITY_OPC, 0x25)
#define OPC_E_DS_MISSING_SIGNATURE_PROPERTIES_ELEMENT MAKE_HRESULT(1, FACILITY_OPC, 0x26)
#define OPC_E_DS_MISSING_SIGNATURE_PROPERTY_ELEMENT MAKE_HRESULT(1, FACILITY_OPC, 0x27)
#define OPC_E_DS_DUPLICATE_SIGNATURE_PROPERTY_ELEMENT MAKE_HRESULT(1, FACILITY_OPC, 0x28)
#define OPC_E_DS_MISSING_SIGNATURE_TIME_PROPERTY MAKE_HRESULT(1, FACILITY_OPC, 0x29)
#define OPC_E_DS_INVALID_SIGNATURE_XML MAKE_HRESULT(1, FACILITY_OPC, 0x2a)
#define OPC_E_DS_INVALID_SIGNATURE_COUNT MAKE_HRESULT(1, FACILITY_OPC, 0x2b)
#define OPC_E_DS_MISSING_SIGNATURE_ALGORITHM MAKE_HRESULT(1, FACILITY_OPC, 0x2c)
#define OPC_E_DS_DUPLICATE_PACKAGE_OBJECT_REFERENCES MAKE_HRESULT(1, FACILITY_OPC, 0x2d)
#define OPC_E_DS_MISSING_PACKAGE_OBJECT_REFERENCE MAKE_HRESULT(1, FACILITY_OPC, 0x2e)
#define OPC_E_DS_EXTERNAL_SIGNATURE_REFERENCE MAKE_HRESULT(1, FACILITY_OPC, 0x2f)
#define OPC_E_DS_REFERENCE_MISSING_CONTENT_TYPE MAKE_HRESULT(1, FACILITY_OPC, 0x30)
#define OPC_E_DS_MULTIPLE_RELATIONSHIP_TRANSFORMS MAKE_HRESULT(1, FACILITY_OPC, 0x31)
#define OPC_E_DS_MISSING_CANONICALIZATION_TRANSFORM MAKE_HRESULT(1, FACILITY_OPC, 0x32)
#define OPC_E_MC_UNEXPECTED_ELEMENT MAKE_HRESULT(1, FACILITY_OPC, 0x33)
#define OPC_E_MC_UNEXPECTED_REQUIRES_ATTR MAKE_HRESULT(1, FACILITY_OPC, 0x34)
#define OPC_E_MC_MISSING_REQUIRES_ATTR MAKE_HRESULT(1, FACILITY_OPC, 0x35)
#define OPC_E_MC_UNEXPECTED_ATTR MAKE_HRESULT(1, FACILITY_OPC, 0x36)
#define OPC_E_MC_INVALID_PREFIX_LIST MAKE_HRESULT(1, FACILITY_OPC, 0x37)
#define OPC_E_MC_INVALID_QNAME_LIST MAKE_HRESULT(1, FACILITY_OPC, 0x38)
#define OPC_E_MC_NESTED_ALTERNATE_CONTENT MAKE_HRESULT(1, FACILITY_OPC, 0x39)
#define OPC_E_MC_UNEXPECTED_CHOICE MAKE_HRESULT(1, FACILITY_OPC, 0x3a)
#define OPC_E_MC_MISSING_CHOICE MAKE_HRESULT(1, FACILITY_OPC, 0x3b)
#define OPC_E_MC_INVALID_ENUM_TYPE MAKE_HRESULT(1, FACILITY_OPC, 0x3c)
#define OPC_E_MC_UNKNOWN_NAMESPACE MAKE_HRESULT(1, FACILITY_OPC, 0x3e)
#define OPC_E_MC_UNKNOWN_PREFIX MAKE_HRESULT(1, FACILITY_OPC, 0x3f)
#define OPC_E_MC_INVALID_ATTRIBUTES_ON_IGNORABLE_ELEMENT MAKE_HRESULT(1, FACILITY_OPC, 0x40)
#define OPC_E_MC_INVALID_XMLNS_ATTRIBUTE MAKE_HRESULT(1, FACILITY_OPC, 0x41)
#define OPC_E_INVALID_XML_ENCODING MAKE_HRESULT(1, FACILITY_OPC, 0x42)
#define OPC_E_DS_SIGNATURE_REFERENCE_MISSING_URI MAKE_HRESULT(1, FACILITY_OPC, 0x43)
#define OPC_E_INVALID_CONTENT_TYPE MAKE_HRESULT(1, FACILITY_OPC, 0x44)
#define OPC_E_DS_SIGNATURE_PROPERTY_MISSING_TARGET MAKE_HRESULT(1, FACILITY_OPC, 0x45)
#define OPC_E_DS_SIGNATURE_METHOD_NOT_SET MAKE_HRESULT(1, FACILITY_OPC, 0x46)
#define OPC_E_DS_DEFAULT_DIGEST_METHOD_NOT_SET MAKE_HRESULT(1, FACILITY_OPC, 0x47)
#define OPC_E_NO_SUCH_RELATIONSHIP MAKE_HRESULT(1, FACILITY_OPC, 0x48)
#define OPC_E_MC_MULTIPLE_FALLBACK_ELEMENTS MAKE_HRESULT(1, FACILITY_OPC, 0x49)
#define OPC_E_MC_INCONSISTENT_PROCESS_CONTENT MAKE_HRESULT(1, FACILITY_OPC, 0x4a)
#define OPC_E_MC_INCONSISTENT_PRESERVE_ATTRIBUTES MAKE_HRESULT(1, FACILITY_OPC, 0x4b)
#define OPC_E_MC_INCONSISTENT_PRESERVE_ELEMENTS MAKE_HRESULT(1, FACILITY_OPC, 0x4c)
#define OPC_E_INVALID_RELATIONSHIP_TARGET_MODE MAKE_HRESULT(1, FACILITY_OPC, 0x4d)
#define OPC_E_COULD_NOT_RECOVER MAKE_HRESULT(1, FACILITY_OPC, 0x4e)
#define OPC_E_UNSUPPORTED_PACKAGE MAKE_HRESULT(1, FACILITY_OPC, 0x4f)
#define OPC_E_ENUM_COLLECTION_CHANGED MAKE_HRESULT(1, FACILITY_OPC, 0x50)
#define OPC_E_ENUM_CANNOT_MOVE_NEXT MAKE_HRESULT(1, FACILITY_OPC, 0x51)
#define OPC_E_ENUM_CANNOT_MOVE_PREVIOUS MAKE_HRESULT(1, FACILITY_OPC, 0x52)
#define OPC_E_ENUM_INVALID_POSITION MAKE_HRESULT(1, FACILITY_OPC, 0x53)
#define OPC_E_DS_SIGNATURE_ORIGIN_EXISTS MAKE_HRESULT(1, FACILITY_OPC, 0x54)
#define OPC_E_DS_UNSIGNED_PACKAGE MAKE_HRESULT(1, FACILITY_OPC, 0x55)
#define OPC_E_DS_MISSING_CERTIFICATE_PART MAKE_HRESULT(1, FACILITY_OPC, 0x56)
#define OPC_E_NO_SUCH_SETTINGS MAKE_HRESULT(1, FACILITY_OPC, 0x57)
#define OPC_E_ZIP_INCORRECT_DATA_SIZE MAKE_HRESULT(1, FACILITY_OPC, 0x1001)
#define OPC_E_ZIP_CORRUPTED_ARCHIVE MAKE_HRESULT(1, FACILITY_OPC, 0x1002)
#define OPC_E_ZIP_COMPRESSION_FAILED MAKE_HRESULT(1, FACILITY_OPC, 0x1003)
#define OPC_E_ZIP_DECOMPRESSION_FAILED MAKE_HRESULT(1, FACILITY_OPC, 0x1004)
#define OPC_E_ZIP_INCONSISTENT_FILEITEM MAKE_HRESULT(1, FACILITY_OPC, 0x1005)
#define OPC_E_ZIP_INCONSISTENT_DIRECTORY MAKE_HRESULT(1, FACILITY_OPC, 0x1006)
#define OPC_E_ZIP_MISSING_DATA_DESCRIPTOR MAKE_HRESULT(1, FACILITY_OPC, 0x1007)
#define OPC_E_ZIP_UNSUPPORTEDARCHIVE MAKE_HRESULT(1, FACILITY_OPC, 0x1008)
#define OPC_E_ZIP_CENTRAL_DIRECTORY_TOO_LARGE MAKE_HRESULT(1, FACILITY_OPC, 0x1009)
#define OPC_E_ZIP_NAME_TOO_LARGE MAKE_HRESULT(1, FACILITY_OPC, 0x100a)
#define OPC_E_ZIP_DUPLICATE_NAME MAKE_HRESULT(1, FACILITY_OPC, 0x100b)
#define OPC_E_ZIP_COMMENT_TOO_LARGE MAKE_HRESULT(1, FACILITY_OPC, 0x100c)
#define OPC_E_ZIP_EXTRA_FIELDS_TOO_LARGE MAKE_HRESULT(1, FACILITY_OPC, 0x100d)
#define OPC_E_ZIP_FILE_HEADER_TOO_LARGE MAKE_HRESULT(1, FACILITY_OPC, 0x100e)
#define OPC_E_ZIP_MISSING_END_OF_CENTRAL_DIRECTORY MAKE_HRESULT(1, FACILITY_OPC, 0x100f)
#define OPC_E_ZIP_REQUIRES_64_BIT MAKE_HRESULT(1, FACILITY_OPC, 0x1010)

DEFINE_GUID(LIBID_MSOPC, 0x3d8d6062, 0x2749, 0x442b, 0x9e,0x32, 0xe4,0x0e,0xf8,0x01,0xa7,0x66);

#ifndef __IOpcCertificateEnumerator_FWD_DEFINED__
#define __IOpcCertificateEnumerator_FWD_DEFINED__
typedef interface IOpcCertificateEnumerator IOpcCertificateEnumerator;
#endif

#ifndef __IOpcCertificateSet_FWD_DEFINED__
#define __IOpcCertificateSet_FWD_DEFINED__
typedef interface IOpcCertificateSet IOpcCertificateSet;
#endif

#ifndef __IOpcDigitalSignature_FWD_DEFINED__
#define __IOpcDigitalSignature_FWD_DEFINED__
typedef interface IOpcDigitalSignature IOpcDigitalSignature;
#endif

#ifndef __IOpcDigitalSignatureEnumerator_FWD_DEFINED__
#define __IOpcDigitalSignatureEnumerator_FWD_DEFINED__
typedef interface IOpcDigitalSignatureEnumerator IOpcDigitalSignatureEnumerator;
#endif

#ifndef __IOpcDigitalSignatureManager_FWD_DEFINED__
#define __IOpcDigitalSignatureManager_FWD_DEFINED__
typedef interface IOpcDigitalSignatureManager IOpcDigitalSignatureManager;
#endif

#ifndef __IOpcPackage_FWD_DEFINED__
#define __IOpcPackage_FWD_DEFINED__
typedef interface IOpcPackage IOpcPackage;
#endif

#ifndef __IOpcPart_FWD_DEFINED__
#define __IOpcPart_FWD_DEFINED__
typedef interface IOpcPart IOpcPart;
#endif

#ifndef __IOpcPartEnumerator_FWD_DEFINED__
#define __IOpcPartEnumerator_FWD_DEFINED__
typedef interface IOpcPartEnumerator IOpcPartEnumerator;
#endif

#ifndef __IOpcPartSet_FWD_DEFINED__
#define __IOpcPartSet_FWD_DEFINED__
typedef interface IOpcPartSet IOpcPartSet;
#endif

#ifndef __IOpcPartUri_FWD_DEFINED__
#define __IOpcPartUri_FWD_DEFINED__
typedef interface IOpcPartUri IOpcPartUri;
#endif

#ifndef __IOpcRelationship_FWD_DEFINED__
#define __IOpcRelationship_FWD_DEFINED__
typedef interface IOpcRelationship IOpcRelationship;
#endif

#ifndef __IOpcRelationshipEnumerator_FWD_DEFINED__
#define __IOpcRelationshipEnumerator_FWD_DEFINED__
typedef interface IOpcRelationshipEnumerator IOpcRelationshipEnumerator;
#endif

#ifndef __IOpcRelationshipSelector_FWD_DEFINED__
#define __IOpcRelationshipSelector_FWD_DEFINED__
typedef interface IOpcRelationshipSelector IOpcRelationshipSelector;
#endif

#ifndef __IOpcRelationshipSelectorSet_FWD_DEFINED__
#define __IOpcRelationshipSelectorSet_FWD_DEFINED__
typedef interface IOpcRelationshipSelectorSet IOpcRelationshipSelectorSet;
#endif

#ifndef __IOpcRelationshipSet_FWD_DEFINED__
#define __IOpcRelationshipSet_FWD_DEFINED__
typedef interface IOpcRelationshipSet IOpcRelationshipSet;
#endif

#ifndef __IOpcSigningOptions_FWD_DEFINED__
#define __IOpcSigningOptions_FWD_DEFINED__
typedef interface IOpcSigningOptions IOpcSigningOptions;
#endif

#ifndef __IOpcSignatureCustomObject_FWD_DEFINED__
#define __IOpcSignatureCustomObject_FWD_DEFINED__
typedef interface IOpcSignatureCustomObject IOpcSignatureCustomObject;
#endif

#ifndef __IOpcSignatureCustomObjectSet_FWD_DEFINED__
#define __IOpcSignatureCustomObjectSet_FWD_DEFINED__
typedef interface IOpcSignatureCustomObjectSet IOpcSignatureCustomObjectSet;
#endif

#ifndef __IOpcSignaturePartReference_FWD_DEFINED__
#define __IOpcSignaturePartReference_FWD_DEFINED__
typedef interface IOpcSignaturePartReference IOpcSignaturePartReference;
#endif

#ifndef __IOpcSignaturePartReferenceEnumerator_FWD_DEFINED__
#define __IOpcSignaturePartReferenceEnumerator_FWD_DEFINED__
typedef interface IOpcSignaturePartReferenceEnumerator IOpcSignaturePartReferenceEnumerator;
#endif

#ifndef __IOpcSignaturePartReferenceSet_FWD_DEFINED__
#define __IOpcSignaturePartReferenceSet_FWD_DEFINED__
typedef interface IOpcSignaturePartReferenceSet IOpcSignaturePartReferenceSet;
#endif

#ifndef __IOpcSignatureReference_FWD_DEFINED__
#define __IOpcSignatureReference_FWD_DEFINED__
typedef interface IOpcSignatureReference IOpcSignatureReference;
#endif

#ifndef __IOpcSignatureReferenceSet_FWD_DEFINED__
#define __IOpcSignatureReferenceSet_FWD_DEFINED__
typedef interface IOpcSignatureReferenceSet IOpcSignatureReferenceSet;
#endif

#ifndef __IOpcSignatureRelationshipReference_FWD_DEFINED__
#define __IOpcSignatureRelationshipReference_FWD_DEFINED__
typedef interface IOpcSignatureRelationshipReference IOpcSignatureRelationshipReference;
#endif

#ifndef __IOpcSignatureRelationshipReferenceEnumerator_FWD_DEFINED__
#define __IOpcSignatureRelationshipReferenceEnumerator_FWD_DEFINED__
typedef interface IOpcSignatureRelationshipReferenceEnumerator IOpcSignatureRelationshipReferenceEnumerator;
#endif

#ifndef __IOpcSignatureRelationshipReferenceSet_FWD_DEFINED__
#define __IOpcSignatureRelationshipReferenceSet_FWD_DEFINED__
typedef interface IOpcSignatureRelationshipReferenceSet IOpcSignatureRelationshipReferenceSet;
#endif

#ifndef __IOpcRelationshipSelectorEnumerator_FWD_DEFINED__
#define __IOpcRelationshipSelectorEnumerator_FWD_DEFINED__
typedef interface IOpcRelationshipSelectorEnumerator IOpcRelationshipSelectorEnumerator;
#endif

#ifndef __IOpcSignatureReferenceEnumerator_FWD_DEFINED__
#define __IOpcSignatureReferenceEnumerator_FWD_DEFINED__
typedef interface IOpcSignatureReferenceEnumerator IOpcSignatureReferenceEnumerator;
#endif

#ifndef __IOpcSignatureCustomObjectEnumerator_FWD_DEFINED__
#define __IOpcSignatureCustomObjectEnumerator_FWD_DEFINED__
typedef interface IOpcSignatureCustomObjectEnumerator IOpcSignatureCustomObjectEnumerator;
#endif

#ifndef __IOpcUri_FWD_DEFINED__
#define __IOpcUri_FWD_DEFINED__
typedef interface IOpcUri IOpcUri;
#endif

typedef enum __WIDL_msopc_generated_name_00000016 {
    OPC_CANONICALIZATION_NONE = 0,
    OPC_CANONICALIZATION_C14N = 1,
    OPC_CANONICALIZATION_C14N_WITH_COMMENTS = 2
} OPC_CANONICALIZATION_METHOD;
typedef enum __WIDL_msopc_generated_name_00000017 {
    OPC_CERTIFICATE_IN_CERTIFICATE_PART = 0,
    OPC_CERTIFICATE_IN_SIGNATURE_PART = 1,
    OPC_CERTIFICATE_NOT_EMBEDDED = 2
} OPC_CERTIFICATE_EMBEDDING_OPTION;
typedef enum __WIDL_msopc_generated_name_00000018 {
    OPC_COMPRESSION_NONE = -1,
    OPC_COMPRESSION_NORMAL = 0,
    OPC_COMPRESSION_MAXIMUM = 1,
    OPC_COMPRESSION_FAST = 2,
    OPC_COMPRESSION_SUPERFAST = 3
} OPC_COMPRESSION_OPTIONS;
typedef enum __WIDL_msopc_generated_name_00000019 {
    OPC_READ_DEFAULT = 0x0,
    OPC_VALIDATE_ON_LOAD = 0x1,
    OPC_CACHE_ON_ACCESS = 0x2
} OPC_READ_FLAGS;
typedef enum __WIDL_msopc_generated_name_0000001A {
    OPC_RELATIONSHIP_SELECT_BY_ID = 0,
    OPC_RELATIONSHIP_SELECT_BY_TYPE = 1
} OPC_RELATIONSHIP_SELECTOR;
typedef enum __WIDL_msopc_generated_name_0000001B {
    OPC_RELATIONSHIP_SIGN_USING_SELECTORS = 0,
    OPC_RELATIONSHIP_SIGN_PART = 1
} OPC_RELATIONSHIPS_SIGNING_OPTION;
typedef enum OPC_SIGNATURE_VALIDATION_RESULT {
    OPC_SIGNATURE_VALID = 0,
    OPC_SIGNATURE_INVALID = -1
} OPC_SIGNATURE_VALIDATION_RESULT;
typedef enum __WIDL_msopc_generated_name_0000001C {
    OPC_SIGNATURE_TIME_FORMAT_MILLISECONDS = 0,
    OPC_SIGNATURE_TIME_FORMAT_SECONDS = 1,
    OPC_SIGNATURE_TIME_FORMAT_MINUTES = 2,
    OPC_SIGNATURE_TIME_FORMAT_DAYS = 3,
    OPC_SIGNATURE_TIME_FORMAT_MONTHS = 4,
    OPC_SIGNATURE_TIME_FORMAT_YEARS = 5
} OPC_SIGNATURE_TIME_FORMAT;
typedef enum __WIDL_msopc_generated_name_0000001D {
    OPC_STREAM_IO_READ = 1,
    OPC_STREAM_IO_WRITE = 2
} OPC_STREAM_IO_MODE;
typedef enum __WIDL_msopc_generated_name_0000001E {
    OPC_URI_TARGET_MODE_INTERNAL = 0,
    OPC_URI_TARGET_MODE_EXTERNAL = 1
} OPC_URI_TARGET_MODE;
typedef enum __WIDL_msopc_generated_name_0000001F {
    OPC_WRITE_DEFAULT = 0x0,
    OPC_WRITE_FORCE_ZIP32 = 0x1
} OPC_WRITE_FLAGS;
DEFINE_ENUM_FLAG_OPERATORS(OPC_READ_FLAGS);
DEFINE_ENUM_FLAG_OPERATORS(OPC_WRITE_FLAGS);
/*****************************************************************************
 * IOpcPart interface
 */
#ifndef __IOpcPart_INTERFACE_DEFINED__
#define __IOpcPart_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcPart, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x71);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42195949-3b79-4fc8-89c6-fc7fb979ee71")
IOpcPart : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRelationshipSet(
        IOpcRelationshipSet **relationshipSet) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetName(
        IOpcPartUri **name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContentType(
        LPWSTR *contentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCompressionOptions(
        OPC_COMPRESSION_OPTIONS *compressionOptions) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcPart, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x71)
#endif
#else
typedef struct IOpcPartVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRelationshipSet)(
        IOpcPart* This,
        IOpcRelationshipSet **relationshipSet);

    HRESULT (STDMETHODCALLTYPE *GetContentStream)(
        IOpcPart* This,
        IStream **stream);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IOpcPart* This,
        IOpcPartUri **name);

    HRESULT (STDMETHODCALLTYPE *GetContentType)(
        IOpcPart* This,
        LPWSTR *contentType);

    HRESULT (STDMETHODCALLTYPE *GetCompressionOptions)(
        IOpcPart* This,
        OPC_COMPRESSION_OPTIONS *compressionOptions);

    END_INTERFACE
} IOpcPartVtbl;
interface IOpcPart {
    CONST_VTBL IOpcPartVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcPart_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcPart_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcPart_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcPart methods ***/
#define IOpcPart_GetRelationshipSet(This,relationshipSet) (This)->lpVtbl->GetRelationshipSet(This,relationshipSet)
#define IOpcPart_GetContentStream(This,stream) (This)->lpVtbl->GetContentStream(This,stream)
#define IOpcPart_GetName(This,name) (This)->lpVtbl->GetName(This,name)
#define IOpcPart_GetContentType(This,contentType) (This)->lpVtbl->GetContentType(This,contentType)
#define IOpcPart_GetCompressionOptions(This,compressionOptions) (This)->lpVtbl->GetCompressionOptions(This,compressionOptions)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcPart_QueryInterface(IOpcPart* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcPart_AddRef(IOpcPart* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcPart_Release(IOpcPart* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcPart methods ***/
static FORCEINLINE HRESULT IOpcPart_GetRelationshipSet(IOpcPart* This,IOpcRelationshipSet **relationshipSet) {
    return This->lpVtbl->GetRelationshipSet(This,relationshipSet);
}
static FORCEINLINE HRESULT IOpcPart_GetContentStream(IOpcPart* This,IStream **stream) {
    return This->lpVtbl->GetContentStream(This,stream);
}
static FORCEINLINE HRESULT IOpcPart_GetName(IOpcPart* This,IOpcPartUri **name) {
    return This->lpVtbl->GetName(This,name);
}
static FORCEINLINE HRESULT IOpcPart_GetContentType(IOpcPart* This,LPWSTR *contentType) {
    return This->lpVtbl->GetContentType(This,contentType);
}
static FORCEINLINE HRESULT IOpcPart_GetCompressionOptions(IOpcPart* This,OPC_COMPRESSION_OPTIONS *compressionOptions) {
    return This->lpVtbl->GetCompressionOptions(This,compressionOptions);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcPart_GetRelationshipSet_Proxy(
    IOpcPart* This,
    IOpcRelationshipSet **relationshipSet);
void __RPC_STUB IOpcPart_GetRelationshipSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPart_GetContentStream_Proxy(
    IOpcPart* This,
    IStream **stream);
void __RPC_STUB IOpcPart_GetContentStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPart_GetName_Proxy(
    IOpcPart* This,
    IOpcPartUri **name);
void __RPC_STUB IOpcPart_GetName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPart_GetContentType_Proxy(
    IOpcPart* This,
    LPWSTR *contentType);
void __RPC_STUB IOpcPart_GetContentType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPart_GetCompressionOptions_Proxy(
    IOpcPart* This,
    OPC_COMPRESSION_OPTIONS *compressionOptions);
void __RPC_STUB IOpcPart_GetCompressionOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcPart_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcPartEnumerator interface
 */
#ifndef __IOpcPartEnumerator_INTERFACE_DEFINED__
#define __IOpcPartEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcPartEnumerator, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x75);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42195949-3b79-4fc8-89c6-fc7fb979ee75")
IOpcPartEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        IOpcPart **part) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcPartEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcPartEnumerator, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x75)
#endif
#else
typedef struct IOpcPartEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcPartEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcPartEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcPartEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcPartEnumerator* This,
        IOpcPart **part);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcPartEnumerator* This,
        IOpcPartEnumerator **copy);

    END_INTERFACE
} IOpcPartEnumeratorVtbl;
interface IOpcPartEnumerator {
    CONST_VTBL IOpcPartEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcPartEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcPartEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcPartEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcPartEnumerator methods ***/
#define IOpcPartEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcPartEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcPartEnumerator_GetCurrent(This,part) (This)->lpVtbl->GetCurrent(This,part)
#define IOpcPartEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcPartEnumerator_QueryInterface(IOpcPartEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcPartEnumerator_AddRef(IOpcPartEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcPartEnumerator_Release(IOpcPartEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcPartEnumerator methods ***/
static FORCEINLINE HRESULT IOpcPartEnumerator_MoveNext(IOpcPartEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcPartEnumerator_MovePrevious(IOpcPartEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcPartEnumerator_GetCurrent(IOpcPartEnumerator* This,IOpcPart **part) {
    return This->lpVtbl->GetCurrent(This,part);
}
static FORCEINLINE HRESULT IOpcPartEnumerator_Clone(IOpcPartEnumerator* This,IOpcPartEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcPartEnumerator_MoveNext_Proxy(
    IOpcPartEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcPartEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartEnumerator_MovePrevious_Proxy(
    IOpcPartEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcPartEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartEnumerator_GetCurrent_Proxy(
    IOpcPartEnumerator* This,
    IOpcPart **part);
void __RPC_STUB IOpcPartEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartEnumerator_Clone_Proxy(
    IOpcPartEnumerator* This,
    IOpcPartEnumerator **copy);
void __RPC_STUB IOpcPartEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcPartEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcPartSet interface
 */
#ifndef __IOpcPartSet_INTERFACE_DEFINED__
#define __IOpcPartSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcPartSet, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x73);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42195949-3b79-4fc8-89c6-fc7fb979ee73")
IOpcPartSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPart(
        IOpcPartUri *name,
        IOpcPart **part) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePart(
        IOpcPartUri *name,
        LPCWSTR contentType,
        OPC_COMPRESSION_OPTIONS compressionOptions,
        IOpcPart **part) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeletePart(
        IOpcPartUri *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE PartExists(
        IOpcPartUri *name,
        WINBOOL *partExists) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumerator(
        IOpcPartEnumerator **partEnumerator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcPartSet, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x73)
#endif
#else
typedef struct IOpcPartSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcPartSet methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPart)(
        IOpcPartSet* This,
        IOpcPartUri *name,
        IOpcPart **part);

    HRESULT (STDMETHODCALLTYPE *CreatePart)(
        IOpcPartSet* This,
        IOpcPartUri *name,
        LPCWSTR contentType,
        OPC_COMPRESSION_OPTIONS compressionOptions,
        IOpcPart **part);

    HRESULT (STDMETHODCALLTYPE *DeletePart)(
        IOpcPartSet* This,
        IOpcPartUri *name);

    HRESULT (STDMETHODCALLTYPE *PartExists)(
        IOpcPartSet* This,
        IOpcPartUri *name,
        WINBOOL *partExists);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IOpcPartSet* This,
        IOpcPartEnumerator **partEnumerator);

    END_INTERFACE
} IOpcPartSetVtbl;
interface IOpcPartSet {
    CONST_VTBL IOpcPartSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcPartSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcPartSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcPartSet_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcPartSet methods ***/
#define IOpcPartSet_GetPart(This,name,part) (This)->lpVtbl->GetPart(This,name,part)
#define IOpcPartSet_CreatePart(This,name,contentType,compressionOptions,part) (This)->lpVtbl->CreatePart(This,name,contentType,compressionOptions,part)
#define IOpcPartSet_DeletePart(This,name) (This)->lpVtbl->DeletePart(This,name)
#define IOpcPartSet_PartExists(This,name,partExists) (This)->lpVtbl->PartExists(This,name,partExists)
#define IOpcPartSet_GetEnumerator(This,partEnumerator) (This)->lpVtbl->GetEnumerator(This,partEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcPartSet_QueryInterface(IOpcPartSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcPartSet_AddRef(IOpcPartSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcPartSet_Release(IOpcPartSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcPartSet methods ***/
static FORCEINLINE HRESULT IOpcPartSet_GetPart(IOpcPartSet* This,IOpcPartUri *name,IOpcPart **part) {
    return This->lpVtbl->GetPart(This,name,part);
}
static FORCEINLINE HRESULT IOpcPartSet_CreatePart(IOpcPartSet* This,IOpcPartUri *name,LPCWSTR contentType,OPC_COMPRESSION_OPTIONS compressionOptions,IOpcPart **part) {
    return This->lpVtbl->CreatePart(This,name,contentType,compressionOptions,part);
}
static FORCEINLINE HRESULT IOpcPartSet_DeletePart(IOpcPartSet* This,IOpcPartUri *name) {
    return This->lpVtbl->DeletePart(This,name);
}
static FORCEINLINE HRESULT IOpcPartSet_PartExists(IOpcPartSet* This,IOpcPartUri *name,WINBOOL *partExists) {
    return This->lpVtbl->PartExists(This,name,partExists);
}
static FORCEINLINE HRESULT IOpcPartSet_GetEnumerator(IOpcPartSet* This,IOpcPartEnumerator **partEnumerator) {
    return This->lpVtbl->GetEnumerator(This,partEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcPartSet_GetPart_Proxy(
    IOpcPartSet* This,
    IOpcPartUri *name,
    IOpcPart **part);
void __RPC_STUB IOpcPartSet_GetPart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartSet_CreatePart_Proxy(
    IOpcPartSet* This,
    IOpcPartUri *name,
    LPCWSTR contentType,
    OPC_COMPRESSION_OPTIONS compressionOptions,
    IOpcPart **part);
void __RPC_STUB IOpcPartSet_CreatePart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartSet_DeletePart_Proxy(
    IOpcPartSet* This,
    IOpcPartUri *name);
void __RPC_STUB IOpcPartSet_DeletePart_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartSet_PartExists_Proxy(
    IOpcPartSet* This,
    IOpcPartUri *name,
    WINBOOL *partExists);
void __RPC_STUB IOpcPartSet_PartExists_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPartSet_GetEnumerator_Proxy(
    IOpcPartSet* This,
    IOpcPartEnumerator **partEnumerator);
void __RPC_STUB IOpcPartSet_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcPartSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcPackage interface
 */
#ifndef __IOpcPackage_INTERFACE_DEFINED__
#define __IOpcPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcPackage, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42195949-3b79-4fc8-89c6-fc7fb979ee70")
IOpcPackage : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPartSet(
        IOpcPartSet **partSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRelationshipSet(
        IOpcRelationshipSet **relationshipSet) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcPackage, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x70)
#endif
#else
typedef struct IOpcPackageVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcPackage methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartSet)(
        IOpcPackage* This,
        IOpcPartSet **partSet);

    HRESULT (STDMETHODCALLTYPE *GetRelationshipSet)(
        IOpcPackage* This,
        IOpcRelationshipSet **relationshipSet);

    END_INTERFACE
} IOpcPackageVtbl;
interface IOpcPackage {
    CONST_VTBL IOpcPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcPackage methods ***/
#define IOpcPackage_GetPartSet(This,partSet) (This)->lpVtbl->GetPartSet(This,partSet)
#define IOpcPackage_GetRelationshipSet(This,relationshipSet) (This)->lpVtbl->GetRelationshipSet(This,relationshipSet)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcPackage_QueryInterface(IOpcPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcPackage_AddRef(IOpcPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcPackage_Release(IOpcPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcPackage methods ***/
static FORCEINLINE HRESULT IOpcPackage_GetPartSet(IOpcPackage* This,IOpcPartSet **partSet) {
    return This->lpVtbl->GetPartSet(This,partSet);
}
static FORCEINLINE HRESULT IOpcPackage_GetRelationshipSet(IOpcPackage* This,IOpcRelationshipSet **relationshipSet) {
    return This->lpVtbl->GetRelationshipSet(This,relationshipSet);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcPackage_GetPartSet_Proxy(
    IOpcPackage* This,
    IOpcPartSet **partSet);
void __RPC_STUB IOpcPackage_GetPartSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcPackage_GetRelationshipSet_Proxy(
    IOpcPackage* This,
    IOpcRelationshipSet **relationshipSet);
void __RPC_STUB IOpcPackage_GetRelationshipSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcRelationship interface
 */
#ifndef __IOpcRelationship_INTERFACE_DEFINED__
#define __IOpcRelationship_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcRelationship, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x72);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42195949-3b79-4fc8-89c6-fc7fb979ee72")
IOpcRelationship : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetId(
        LPWSTR *relationshipIdentifier) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRelationshipType(
        LPWSTR *relationshipType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSourceUri(
        IOpcUri **sourceUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTargetUri(
        IUri **targetUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTargetMode(
        OPC_URI_TARGET_MODE *targetMode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcRelationship, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x72)
#endif
#else
typedef struct IOpcRelationshipVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcRelationship methods ***/
    HRESULT (STDMETHODCALLTYPE *GetId)(
        IOpcRelationship* This,
        LPWSTR *relationshipIdentifier);

    HRESULT (STDMETHODCALLTYPE *GetRelationshipType)(
        IOpcRelationship* This,
        LPWSTR *relationshipType);

    HRESULT (STDMETHODCALLTYPE *GetSourceUri)(
        IOpcRelationship* This,
        IOpcUri **sourceUri);

    HRESULT (STDMETHODCALLTYPE *GetTargetUri)(
        IOpcRelationship* This,
        IUri **targetUri);

    HRESULT (STDMETHODCALLTYPE *GetTargetMode)(
        IOpcRelationship* This,
        OPC_URI_TARGET_MODE *targetMode);

    END_INTERFACE
} IOpcRelationshipVtbl;
interface IOpcRelationship {
    CONST_VTBL IOpcRelationshipVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcRelationship_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcRelationship_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcRelationship_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcRelationship methods ***/
#define IOpcRelationship_GetId(This,relationshipIdentifier) (This)->lpVtbl->GetId(This,relationshipIdentifier)
#define IOpcRelationship_GetRelationshipType(This,relationshipType) (This)->lpVtbl->GetRelationshipType(This,relationshipType)
#define IOpcRelationship_GetSourceUri(This,sourceUri) (This)->lpVtbl->GetSourceUri(This,sourceUri)
#define IOpcRelationship_GetTargetUri(This,targetUri) (This)->lpVtbl->GetTargetUri(This,targetUri)
#define IOpcRelationship_GetTargetMode(This,targetMode) (This)->lpVtbl->GetTargetMode(This,targetMode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcRelationship_QueryInterface(IOpcRelationship* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcRelationship_AddRef(IOpcRelationship* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcRelationship_Release(IOpcRelationship* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcRelationship methods ***/
static FORCEINLINE HRESULT IOpcRelationship_GetId(IOpcRelationship* This,LPWSTR *relationshipIdentifier) {
    return This->lpVtbl->GetId(This,relationshipIdentifier);
}
static FORCEINLINE HRESULT IOpcRelationship_GetRelationshipType(IOpcRelationship* This,LPWSTR *relationshipType) {
    return This->lpVtbl->GetRelationshipType(This,relationshipType);
}
static FORCEINLINE HRESULT IOpcRelationship_GetSourceUri(IOpcRelationship* This,IOpcUri **sourceUri) {
    return This->lpVtbl->GetSourceUri(This,sourceUri);
}
static FORCEINLINE HRESULT IOpcRelationship_GetTargetUri(IOpcRelationship* This,IUri **targetUri) {
    return This->lpVtbl->GetTargetUri(This,targetUri);
}
static FORCEINLINE HRESULT IOpcRelationship_GetTargetMode(IOpcRelationship* This,OPC_URI_TARGET_MODE *targetMode) {
    return This->lpVtbl->GetTargetMode(This,targetMode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcRelationship_GetId_Proxy(
    IOpcRelationship* This,
    LPWSTR *relationshipIdentifier);
void __RPC_STUB IOpcRelationship_GetId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationship_GetRelationshipType_Proxy(
    IOpcRelationship* This,
    LPWSTR *relationshipType);
void __RPC_STUB IOpcRelationship_GetRelationshipType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationship_GetSourceUri_Proxy(
    IOpcRelationship* This,
    IOpcUri **sourceUri);
void __RPC_STUB IOpcRelationship_GetSourceUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationship_GetTargetUri_Proxy(
    IOpcRelationship* This,
    IUri **targetUri);
void __RPC_STUB IOpcRelationship_GetTargetUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationship_GetTargetMode_Proxy(
    IOpcRelationship* This,
    OPC_URI_TARGET_MODE *targetMode);
void __RPC_STUB IOpcRelationship_GetTargetMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcRelationship_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcRelationshipEnumerator interface
 */
#ifndef __IOpcRelationshipEnumerator_INTERFACE_DEFINED__
#define __IOpcRelationshipEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcRelationshipEnumerator, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42195949-3b79-4fc8-89c6-fc7fb979ee76")
IOpcRelationshipEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        IOpcRelationship **relationship) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcRelationshipEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcRelationshipEnumerator, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x76)
#endif
#else
typedef struct IOpcRelationshipEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcRelationshipEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcRelationshipEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcRelationshipEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcRelationshipEnumerator* This,
        IOpcRelationship **relationship);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcRelationshipEnumerator* This,
        IOpcRelationshipEnumerator **copy);

    END_INTERFACE
} IOpcRelationshipEnumeratorVtbl;
interface IOpcRelationshipEnumerator {
    CONST_VTBL IOpcRelationshipEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcRelationshipEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcRelationshipEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcRelationshipEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcRelationshipEnumerator methods ***/
#define IOpcRelationshipEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcRelationshipEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcRelationshipEnumerator_GetCurrent(This,relationship) (This)->lpVtbl->GetCurrent(This,relationship)
#define IOpcRelationshipEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcRelationshipEnumerator_QueryInterface(IOpcRelationshipEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcRelationshipEnumerator_AddRef(IOpcRelationshipEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcRelationshipEnumerator_Release(IOpcRelationshipEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcRelationshipEnumerator methods ***/
static FORCEINLINE HRESULT IOpcRelationshipEnumerator_MoveNext(IOpcRelationshipEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcRelationshipEnumerator_MovePrevious(IOpcRelationshipEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcRelationshipEnumerator_GetCurrent(IOpcRelationshipEnumerator* This,IOpcRelationship **relationship) {
    return This->lpVtbl->GetCurrent(This,relationship);
}
static FORCEINLINE HRESULT IOpcRelationshipEnumerator_Clone(IOpcRelationshipEnumerator* This,IOpcRelationshipEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcRelationshipEnumerator_MoveNext_Proxy(
    IOpcRelationshipEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcRelationshipEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipEnumerator_MovePrevious_Proxy(
    IOpcRelationshipEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcRelationshipEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipEnumerator_GetCurrent_Proxy(
    IOpcRelationshipEnumerator* This,
    IOpcRelationship **relationship);
void __RPC_STUB IOpcRelationshipEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipEnumerator_Clone_Proxy(
    IOpcRelationshipEnumerator* This,
    IOpcRelationshipEnumerator **copy);
void __RPC_STUB IOpcRelationshipEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcRelationshipEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcRelationshipSelector interface
 */
#ifndef __IOpcRelationshipSelector_INTERFACE_DEFINED__
#define __IOpcRelationshipSelector_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcRelationshipSelector, 0xf8f26c7f, 0xb28f, 0x4899, 0x84,0xc8, 0x5d,0x56,0x39,0xed,0xe7,0x5f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f8f26c7f-b28f-4899-84c8-5d5639ede75f")
IOpcRelationshipSelector : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSelectorType(
        OPC_RELATIONSHIP_SELECTOR *selector) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectionCriterion(
        LPWSTR *selectionCriterion) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcRelationshipSelector, 0xf8f26c7f, 0xb28f, 0x4899, 0x84,0xc8, 0x5d,0x56,0x39,0xed,0xe7,0x5f)
#endif
#else
typedef struct IOpcRelationshipSelectorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcRelationshipSelector methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSelectorType)(
        IOpcRelationshipSelector* This,
        OPC_RELATIONSHIP_SELECTOR *selector);

    HRESULT (STDMETHODCALLTYPE *GetSelectionCriterion)(
        IOpcRelationshipSelector* This,
        LPWSTR *selectionCriterion);

    END_INTERFACE
} IOpcRelationshipSelectorVtbl;
interface IOpcRelationshipSelector {
    CONST_VTBL IOpcRelationshipSelectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcRelationshipSelector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcRelationshipSelector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcRelationshipSelector_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcRelationshipSelector methods ***/
#define IOpcRelationshipSelector_GetSelectorType(This,selector) (This)->lpVtbl->GetSelectorType(This,selector)
#define IOpcRelationshipSelector_GetSelectionCriterion(This,selectionCriterion) (This)->lpVtbl->GetSelectionCriterion(This,selectionCriterion)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcRelationshipSelector_QueryInterface(IOpcRelationshipSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcRelationshipSelector_AddRef(IOpcRelationshipSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcRelationshipSelector_Release(IOpcRelationshipSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcRelationshipSelector methods ***/
static FORCEINLINE HRESULT IOpcRelationshipSelector_GetSelectorType(IOpcRelationshipSelector* This,OPC_RELATIONSHIP_SELECTOR *selector) {
    return This->lpVtbl->GetSelectorType(This,selector);
}
static FORCEINLINE HRESULT IOpcRelationshipSelector_GetSelectionCriterion(IOpcRelationshipSelector* This,LPWSTR *selectionCriterion) {
    return This->lpVtbl->GetSelectionCriterion(This,selectionCriterion);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcRelationshipSelector_GetSelectorType_Proxy(
    IOpcRelationshipSelector* This,
    OPC_RELATIONSHIP_SELECTOR *selector);
void __RPC_STUB IOpcRelationshipSelector_GetSelectorType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSelector_GetSelectionCriterion_Proxy(
    IOpcRelationshipSelector* This,
    LPWSTR *selectionCriterion);
void __RPC_STUB IOpcRelationshipSelector_GetSelectionCriterion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcRelationshipSelector_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcRelationshipSet interface
 */
#ifndef __IOpcRelationshipSet_INTERFACE_DEFINED__
#define __IOpcRelationshipSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcRelationshipSet, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42195949-3b79-4fc8-89c6-fc7fb979ee74")
IOpcRelationshipSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRelationship(
        LPCWSTR relationshipIdentifier,
        IOpcRelationship **relationship) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRelationship(
        LPCWSTR relationshipIdentifier,
        LPCWSTR relationshipType,
        IUri *targetUri,
        OPC_URI_TARGET_MODE targetMode,
        IOpcRelationship **relationship) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteRelationship(
        LPCWSTR relationshipIdentifier) = 0;

    virtual HRESULT STDMETHODCALLTYPE RelationshipExists(
        LPCWSTR relationshipIdentifier,
        WINBOOL *relationshipExists) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumerator(
        IOpcRelationshipEnumerator **relationshipEnumerator) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumeratorForType(
        LPCWSTR relationshipType,
        IOpcRelationshipEnumerator **relationshipEnumerator) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRelationshipsContentStream(
        IStream **contents) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcRelationshipSet, 0x42195949, 0x3b79, 0x4fc8, 0x89,0xc6, 0xfc,0x7f,0xb9,0x79,0xee,0x74)
#endif
#else
typedef struct IOpcRelationshipSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcRelationshipSet methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRelationship)(
        IOpcRelationshipSet* This,
        LPCWSTR relationshipIdentifier,
        IOpcRelationship **relationship);

    HRESULT (STDMETHODCALLTYPE *CreateRelationship)(
        IOpcRelationshipSet* This,
        LPCWSTR relationshipIdentifier,
        LPCWSTR relationshipType,
        IUri *targetUri,
        OPC_URI_TARGET_MODE targetMode,
        IOpcRelationship **relationship);

    HRESULT (STDMETHODCALLTYPE *DeleteRelationship)(
        IOpcRelationshipSet* This,
        LPCWSTR relationshipIdentifier);

    HRESULT (STDMETHODCALLTYPE *RelationshipExists)(
        IOpcRelationshipSet* This,
        LPCWSTR relationshipIdentifier,
        WINBOOL *relationshipExists);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IOpcRelationshipSet* This,
        IOpcRelationshipEnumerator **relationshipEnumerator);

    HRESULT (STDMETHODCALLTYPE *GetEnumeratorForType)(
        IOpcRelationshipSet* This,
        LPCWSTR relationshipType,
        IOpcRelationshipEnumerator **relationshipEnumerator);

    HRESULT (STDMETHODCALLTYPE *GetRelationshipsContentStream)(
        IOpcRelationshipSet* This,
        IStream **contents);

    END_INTERFACE
} IOpcRelationshipSetVtbl;
interface IOpcRelationshipSet {
    CONST_VTBL IOpcRelationshipSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcRelationshipSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcRelationshipSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcRelationshipSet_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcRelationshipSet methods ***/
#define IOpcRelationshipSet_GetRelationship(This,relationshipIdentifier,relationship) (This)->lpVtbl->GetRelationship(This,relationshipIdentifier,relationship)
#define IOpcRelationshipSet_CreateRelationship(This,relationshipIdentifier,relationshipType,targetUri,targetMode,relationship) (This)->lpVtbl->CreateRelationship(This,relationshipIdentifier,relationshipType,targetUri,targetMode,relationship)
#define IOpcRelationshipSet_DeleteRelationship(This,relationshipIdentifier) (This)->lpVtbl->DeleteRelationship(This,relationshipIdentifier)
#define IOpcRelationshipSet_RelationshipExists(This,relationshipIdentifier,relationshipExists) (This)->lpVtbl->RelationshipExists(This,relationshipIdentifier,relationshipExists)
#define IOpcRelationshipSet_GetEnumerator(This,relationshipEnumerator) (This)->lpVtbl->GetEnumerator(This,relationshipEnumerator)
#define IOpcRelationshipSet_GetEnumeratorForType(This,relationshipType,relationshipEnumerator) (This)->lpVtbl->GetEnumeratorForType(This,relationshipType,relationshipEnumerator)
#define IOpcRelationshipSet_GetRelationshipsContentStream(This,contents) (This)->lpVtbl->GetRelationshipsContentStream(This,contents)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcRelationshipSet_QueryInterface(IOpcRelationshipSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcRelationshipSet_AddRef(IOpcRelationshipSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcRelationshipSet_Release(IOpcRelationshipSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcRelationshipSet methods ***/
static FORCEINLINE HRESULT IOpcRelationshipSet_GetRelationship(IOpcRelationshipSet* This,LPCWSTR relationshipIdentifier,IOpcRelationship **relationship) {
    return This->lpVtbl->GetRelationship(This,relationshipIdentifier,relationship);
}
static FORCEINLINE HRESULT IOpcRelationshipSet_CreateRelationship(IOpcRelationshipSet* This,LPCWSTR relationshipIdentifier,LPCWSTR relationshipType,IUri *targetUri,OPC_URI_TARGET_MODE targetMode,IOpcRelationship **relationship) {
    return This->lpVtbl->CreateRelationship(This,relationshipIdentifier,relationshipType,targetUri,targetMode,relationship);
}
static FORCEINLINE HRESULT IOpcRelationshipSet_DeleteRelationship(IOpcRelationshipSet* This,LPCWSTR relationshipIdentifier) {
    return This->lpVtbl->DeleteRelationship(This,relationshipIdentifier);
}
static FORCEINLINE HRESULT IOpcRelationshipSet_RelationshipExists(IOpcRelationshipSet* This,LPCWSTR relationshipIdentifier,WINBOOL *relationshipExists) {
    return This->lpVtbl->RelationshipExists(This,relationshipIdentifier,relationshipExists);
}
static FORCEINLINE HRESULT IOpcRelationshipSet_GetEnumerator(IOpcRelationshipSet* This,IOpcRelationshipEnumerator **relationshipEnumerator) {
    return This->lpVtbl->GetEnumerator(This,relationshipEnumerator);
}
static FORCEINLINE HRESULT IOpcRelationshipSet_GetEnumeratorForType(IOpcRelationshipSet* This,LPCWSTR relationshipType,IOpcRelationshipEnumerator **relationshipEnumerator) {
    return This->lpVtbl->GetEnumeratorForType(This,relationshipType,relationshipEnumerator);
}
static FORCEINLINE HRESULT IOpcRelationshipSet_GetRelationshipsContentStream(IOpcRelationshipSet* This,IStream **contents) {
    return This->lpVtbl->GetRelationshipsContentStream(This,contents);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcRelationshipSet_GetRelationship_Proxy(
    IOpcRelationshipSet* This,
    LPCWSTR relationshipIdentifier,
    IOpcRelationship **relationship);
void __RPC_STUB IOpcRelationshipSet_GetRelationship_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSet_CreateRelationship_Proxy(
    IOpcRelationshipSet* This,
    LPCWSTR relationshipIdentifier,
    LPCWSTR relationshipType,
    IUri *targetUri,
    OPC_URI_TARGET_MODE targetMode,
    IOpcRelationship **relationship);
void __RPC_STUB IOpcRelationshipSet_CreateRelationship_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSet_DeleteRelationship_Proxy(
    IOpcRelationshipSet* This,
    LPCWSTR relationshipIdentifier);
void __RPC_STUB IOpcRelationshipSet_DeleteRelationship_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSet_RelationshipExists_Proxy(
    IOpcRelationshipSet* This,
    LPCWSTR relationshipIdentifier,
    WINBOOL *relationshipExists);
void __RPC_STUB IOpcRelationshipSet_RelationshipExists_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSet_GetEnumerator_Proxy(
    IOpcRelationshipSet* This,
    IOpcRelationshipEnumerator **relationshipEnumerator);
void __RPC_STUB IOpcRelationshipSet_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSet_GetEnumeratorForType_Proxy(
    IOpcRelationshipSet* This,
    LPCWSTR relationshipType,
    IOpcRelationshipEnumerator **relationshipEnumerator);
void __RPC_STUB IOpcRelationshipSet_GetEnumeratorForType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSet_GetRelationshipsContentStream_Proxy(
    IOpcRelationshipSet* This,
    IStream **contents);
void __RPC_STUB IOpcRelationshipSet_GetRelationshipsContentStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcRelationshipSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureCustomObject interface
 */
#ifndef __IOpcSignatureCustomObject_INTERFACE_DEFINED__
#define __IOpcSignatureCustomObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureCustomObject, 0x5d77a19e, 0x62c1, 0x44e7, 0xbe,0xcd, 0x45,0xda,0x5a,0xe5,0x1a,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5d77a19e-62c1-44e7-becd-45da5ae51a56")
IOpcSignatureCustomObject : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetXml(
        UINT8 **xmlMarkup,
        UINT32 *count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureCustomObject, 0x5d77a19e, 0x62c1, 0x44e7, 0xbe,0xcd, 0x45,0xda,0x5a,0xe5,0x1a,0x56)
#endif
#else
typedef struct IOpcSignatureCustomObjectVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureCustomObject methods ***/
    HRESULT (STDMETHODCALLTYPE *GetXml)(
        IOpcSignatureCustomObject* This,
        UINT8 **xmlMarkup,
        UINT32 *count);

    END_INTERFACE
} IOpcSignatureCustomObjectVtbl;
interface IOpcSignatureCustomObject {
    CONST_VTBL IOpcSignatureCustomObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureCustomObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureCustomObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureCustomObject_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureCustomObject methods ***/
#define IOpcSignatureCustomObject_GetXml(This,xmlMarkup,count) (This)->lpVtbl->GetXml(This,xmlMarkup,count)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureCustomObject_QueryInterface(IOpcSignatureCustomObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureCustomObject_AddRef(IOpcSignatureCustomObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureCustomObject_Release(IOpcSignatureCustomObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureCustomObject methods ***/
static FORCEINLINE HRESULT IOpcSignatureCustomObject_GetXml(IOpcSignatureCustomObject* This,UINT8 **xmlMarkup,UINT32 *count) {
    return This->lpVtbl->GetXml(This,xmlMarkup,count);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureCustomObject_GetXml_Proxy(
    IOpcSignatureCustomObject* This,
    UINT8 **xmlMarkup,
    UINT32 *count);
void __RPC_STUB IOpcSignatureCustomObject_GetXml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureCustomObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureCustomObjectEnumerator interface
 */
#ifndef __IOpcSignatureCustomObjectEnumerator_INTERFACE_DEFINED__
#define __IOpcSignatureCustomObjectEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureCustomObjectEnumerator, 0x5ee4fe1d, 0xe1b0, 0x4683, 0x80,0x79, 0x7e,0xa0,0xfc,0xf8,0x0b,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5ee4fe1d-e1b0-4683-8079-7ea0fcf80b4c")
IOpcSignatureCustomObjectEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        IOpcSignatureCustomObject **customObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcSignatureCustomObjectEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureCustomObjectEnumerator, 0x5ee4fe1d, 0xe1b0, 0x4683, 0x80,0x79, 0x7e,0xa0,0xfc,0xf8,0x0b,0x4c)
#endif
#else
typedef struct IOpcSignatureCustomObjectEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureCustomObjectEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcSignatureCustomObjectEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcSignatureCustomObjectEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcSignatureCustomObjectEnumerator* This,
        IOpcSignatureCustomObject **customObject);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcSignatureCustomObjectEnumerator* This,
        IOpcSignatureCustomObjectEnumerator **copy);

    END_INTERFACE
} IOpcSignatureCustomObjectEnumeratorVtbl;
interface IOpcSignatureCustomObjectEnumerator {
    CONST_VTBL IOpcSignatureCustomObjectEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureCustomObjectEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureCustomObjectEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureCustomObjectEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureCustomObjectEnumerator methods ***/
#define IOpcSignatureCustomObjectEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcSignatureCustomObjectEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcSignatureCustomObjectEnumerator_GetCurrent(This,customObject) (This)->lpVtbl->GetCurrent(This,customObject)
#define IOpcSignatureCustomObjectEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureCustomObjectEnumerator_QueryInterface(IOpcSignatureCustomObjectEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureCustomObjectEnumerator_AddRef(IOpcSignatureCustomObjectEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureCustomObjectEnumerator_Release(IOpcSignatureCustomObjectEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureCustomObjectEnumerator methods ***/
static FORCEINLINE HRESULT IOpcSignatureCustomObjectEnumerator_MoveNext(IOpcSignatureCustomObjectEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcSignatureCustomObjectEnumerator_MovePrevious(IOpcSignatureCustomObjectEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcSignatureCustomObjectEnumerator_GetCurrent(IOpcSignatureCustomObjectEnumerator* This,IOpcSignatureCustomObject **customObject) {
    return This->lpVtbl->GetCurrent(This,customObject);
}
static FORCEINLINE HRESULT IOpcSignatureCustomObjectEnumerator_Clone(IOpcSignatureCustomObjectEnumerator* This,IOpcSignatureCustomObjectEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureCustomObjectEnumerator_MoveNext_Proxy(
    IOpcSignatureCustomObjectEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcSignatureCustomObjectEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureCustomObjectEnumerator_MovePrevious_Proxy(
    IOpcSignatureCustomObjectEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcSignatureCustomObjectEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureCustomObjectEnumerator_GetCurrent_Proxy(
    IOpcSignatureCustomObjectEnumerator* This,
    IOpcSignatureCustomObject **customObject);
void __RPC_STUB IOpcSignatureCustomObjectEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureCustomObjectEnumerator_Clone_Proxy(
    IOpcSignatureCustomObjectEnumerator* This,
    IOpcSignatureCustomObjectEnumerator **copy);
void __RPC_STUB IOpcSignatureCustomObjectEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureCustomObjectEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignaturePartReference interface
 */
#ifndef __IOpcSignaturePartReference_INTERFACE_DEFINED__
#define __IOpcSignaturePartReference_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignaturePartReference, 0xe24231ca, 0x59f4, 0x484e, 0xb6,0x4b, 0x36,0xee,0xda,0x36,0x07,0x2c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e24231ca-59f4-484e-b64b-36eeda36072c")
IOpcSignaturePartReference : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPartName(
        IOpcPartUri **partName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContentType(
        LPWSTR *contentType) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetDigestValue(
        UINT8 **digestValue,
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformMethod(
        OPC_CANONICALIZATION_METHOD *transformMethod) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignaturePartReference, 0xe24231ca, 0x59f4, 0x484e, 0xb6,0x4b, 0x36,0xee,0xda,0x36,0x07,0x2c)
#endif
#else
typedef struct IOpcSignaturePartReferenceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignaturePartReference methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IOpcSignaturePartReference* This,
        IOpcPartUri **partName);

    HRESULT (STDMETHODCALLTYPE *GetContentType)(
        IOpcSignaturePartReference* This,
        LPWSTR *contentType);

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

    HRESULT (STDMETHODCALLTYPE *GetDigestValue)(
        IOpcSignaturePartReference* This,
        UINT8 **digestValue,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetTransformMethod)(
        IOpcSignaturePartReference* This,
        OPC_CANONICALIZATION_METHOD *transformMethod);

    END_INTERFACE
} IOpcSignaturePartReferenceVtbl;
interface IOpcSignaturePartReference {
    CONST_VTBL IOpcSignaturePartReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignaturePartReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignaturePartReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignaturePartReference_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignaturePartReference methods ***/
#define IOpcSignaturePartReference_GetPartName(This,partName) (This)->lpVtbl->GetPartName(This,partName)
#define IOpcSignaturePartReference_GetContentType(This,contentType) (This)->lpVtbl->GetContentType(This,contentType)
#define IOpcSignaturePartReference_GetDigestMethod(This,digestMethod) (This)->lpVtbl->GetDigestMethod(This,digestMethod)
#define IOpcSignaturePartReference_GetDigestValue(This,digestValue,count) (This)->lpVtbl->GetDigestValue(This,digestValue,count)
#define IOpcSignaturePartReference_GetTransformMethod(This,transformMethod) (This)->lpVtbl->GetTransformMethod(This,transformMethod)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignaturePartReference_QueryInterface(IOpcSignaturePartReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignaturePartReference_AddRef(IOpcSignaturePartReference* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignaturePartReference_Release(IOpcSignaturePartReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignaturePartReference methods ***/
static FORCEINLINE HRESULT IOpcSignaturePartReference_GetPartName(IOpcSignaturePartReference* This,IOpcPartUri **partName) {
    return This->lpVtbl->GetPartName(This,partName);
}
static FORCEINLINE HRESULT IOpcSignaturePartReference_GetContentType(IOpcSignaturePartReference* This,LPWSTR *contentType) {
    return This->lpVtbl->GetContentType(This,contentType);
}
static FORCEINLINE HRESULT IOpcSignaturePartReference_GetDigestMethod(IOpcSignaturePartReference* This,LPWSTR *digestMethod) {
    return This->lpVtbl->GetDigestMethod(This,digestMethod);
}
static FORCEINLINE HRESULT IOpcSignaturePartReference_GetDigestValue(IOpcSignaturePartReference* This,UINT8 **digestValue,UINT32 *count) {
    return This->lpVtbl->GetDigestValue(This,digestValue,count);
}
static FORCEINLINE HRESULT IOpcSignaturePartReference_GetTransformMethod(IOpcSignaturePartReference* This,OPC_CANONICALIZATION_METHOD *transformMethod) {
    return This->lpVtbl->GetTransformMethod(This,transformMethod);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignaturePartReference_GetPartName_Proxy(
    IOpcSignaturePartReference* This,
    IOpcPartUri **partName);
void __RPC_STUB IOpcSignaturePartReference_GetPartName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReference_GetContentType_Proxy(
    IOpcSignaturePartReference* This,
    LPWSTR *contentType);
void __RPC_STUB IOpcSignaturePartReference_GetContentType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReference_GetDigestMethod_Proxy(
    IOpcSignaturePartReference* This,
    LPWSTR *digestMethod);
void __RPC_STUB IOpcSignaturePartReference_GetDigestMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReference_GetDigestValue_Proxy(
    IOpcSignaturePartReference* This,
    UINT8 **digestValue,
    UINT32 *count);
void __RPC_STUB IOpcSignaturePartReference_GetDigestValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReference_GetTransformMethod_Proxy(
    IOpcSignaturePartReference* This,
    OPC_CANONICALIZATION_METHOD *transformMethod);
void __RPC_STUB IOpcSignaturePartReference_GetTransformMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignaturePartReference_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignaturePartReferenceEnumerator interface
 */
#ifndef __IOpcSignaturePartReferenceEnumerator_INTERFACE_DEFINED__
#define __IOpcSignaturePartReferenceEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignaturePartReferenceEnumerator, 0x80eb1561, 0x8c77, 0x49cf, 0x82,0x66, 0x45,0x9b,0x35,0x6e,0xe9,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("80eb1561-8c77-49cf-8266-459b356ee99a")
IOpcSignaturePartReferenceEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        IOpcSignaturePartReference **partReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcSignaturePartReferenceEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignaturePartReferenceEnumerator, 0x80eb1561, 0x8c77, 0x49cf, 0x82,0x66, 0x45,0x9b,0x35,0x6e,0xe9,0x9a)
#endif
#else
typedef struct IOpcSignaturePartReferenceEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignaturePartReferenceEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcSignaturePartReferenceEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcSignaturePartReferenceEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcSignaturePartReferenceEnumerator* This,
        IOpcSignaturePartReference **partReference);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcSignaturePartReferenceEnumerator* This,
        IOpcSignaturePartReferenceEnumerator **copy);

    END_INTERFACE
} IOpcSignaturePartReferenceEnumeratorVtbl;
interface IOpcSignaturePartReferenceEnumerator {
    CONST_VTBL IOpcSignaturePartReferenceEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignaturePartReferenceEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignaturePartReferenceEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignaturePartReferenceEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignaturePartReferenceEnumerator methods ***/
#define IOpcSignaturePartReferenceEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcSignaturePartReferenceEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcSignaturePartReferenceEnumerator_GetCurrent(This,partReference) (This)->lpVtbl->GetCurrent(This,partReference)
#define IOpcSignaturePartReferenceEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignaturePartReferenceEnumerator_QueryInterface(IOpcSignaturePartReferenceEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignaturePartReferenceEnumerator_AddRef(IOpcSignaturePartReferenceEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignaturePartReferenceEnumerator_Release(IOpcSignaturePartReferenceEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignaturePartReferenceEnumerator methods ***/
static FORCEINLINE HRESULT IOpcSignaturePartReferenceEnumerator_MoveNext(IOpcSignaturePartReferenceEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcSignaturePartReferenceEnumerator_MovePrevious(IOpcSignaturePartReferenceEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcSignaturePartReferenceEnumerator_GetCurrent(IOpcSignaturePartReferenceEnumerator* This,IOpcSignaturePartReference **partReference) {
    return This->lpVtbl->GetCurrent(This,partReference);
}
static FORCEINLINE HRESULT IOpcSignaturePartReferenceEnumerator_Clone(IOpcSignaturePartReferenceEnumerator* This,IOpcSignaturePartReferenceEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignaturePartReferenceEnumerator_MoveNext_Proxy(
    IOpcSignaturePartReferenceEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcSignaturePartReferenceEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReferenceEnumerator_MovePrevious_Proxy(
    IOpcSignaturePartReferenceEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcSignaturePartReferenceEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReferenceEnumerator_GetCurrent_Proxy(
    IOpcSignaturePartReferenceEnumerator* This,
    IOpcSignaturePartReference **partReference);
void __RPC_STUB IOpcSignaturePartReferenceEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReferenceEnumerator_Clone_Proxy(
    IOpcSignaturePartReferenceEnumerator* This,
    IOpcSignaturePartReferenceEnumerator **copy);
void __RPC_STUB IOpcSignaturePartReferenceEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignaturePartReferenceEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureReference interface
 */
#ifndef __IOpcSignatureReference_INTERFACE_DEFINED__
#define __IOpcSignatureReference_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureReference, 0x1b47005e, 0x3011, 0x4edc, 0xbe,0x6f, 0x0f,0x65,0xe5,0xab,0x03,0x42);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1b47005e-3011-4edc-be6f-0f65e5ab0342")
IOpcSignatureReference : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetId(
        LPWSTR *referenceId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUri(
        IUri **referenceUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetType(
        LPWSTR *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformMethod(
        OPC_CANONICALIZATION_METHOD *transformMethod) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetDigestValue(
        UINT8 **digestValue,
        UINT32 *count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureReference, 0x1b47005e, 0x3011, 0x4edc, 0xbe,0x6f, 0x0f,0x65,0xe5,0xab,0x03,0x42)
#endif
#else
typedef struct IOpcSignatureReferenceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureReference methods ***/
    HRESULT (STDMETHODCALLTYPE *GetId)(
        IOpcSignatureReference* This,
        LPWSTR *referenceId);

    HRESULT (STDMETHODCALLTYPE *GetUri)(
        IOpcSignatureReference* This,
        IUri **referenceUri);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IOpcSignatureReference* This,
        LPWSTR *type);

    HRESULT (STDMETHODCALLTYPE *GetTransformMethod)(
        IOpcSignatureReference* This,
        OPC_CANONICALIZATION_METHOD *transformMethod);

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

    HRESULT (STDMETHODCALLTYPE *GetDigestValue)(
        IOpcSignatureReference* This,
        UINT8 **digestValue,
        UINT32 *count);

    END_INTERFACE
} IOpcSignatureReferenceVtbl;
interface IOpcSignatureReference {
    CONST_VTBL IOpcSignatureReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureReference_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureReference methods ***/
#define IOpcSignatureReference_GetId(This,referenceId) (This)->lpVtbl->GetId(This,referenceId)
#define IOpcSignatureReference_GetUri(This,referenceUri) (This)->lpVtbl->GetUri(This,referenceUri)
#define IOpcSignatureReference_GetType(This,type) (This)->lpVtbl->GetType(This,type)
#define IOpcSignatureReference_GetTransformMethod(This,transformMethod) (This)->lpVtbl->GetTransformMethod(This,transformMethod)
#define IOpcSignatureReference_GetDigestMethod(This,digestMethod) (This)->lpVtbl->GetDigestMethod(This,digestMethod)
#define IOpcSignatureReference_GetDigestValue(This,digestValue,count) (This)->lpVtbl->GetDigestValue(This,digestValue,count)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureReference_QueryInterface(IOpcSignatureReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureReference_AddRef(IOpcSignatureReference* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureReference_Release(IOpcSignatureReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureReference methods ***/
static FORCEINLINE HRESULT IOpcSignatureReference_GetId(IOpcSignatureReference* This,LPWSTR *referenceId) {
    return This->lpVtbl->GetId(This,referenceId);
}
static FORCEINLINE HRESULT IOpcSignatureReference_GetUri(IOpcSignatureReference* This,IUri **referenceUri) {
    return This->lpVtbl->GetUri(This,referenceUri);
}
static FORCEINLINE HRESULT IOpcSignatureReference_GetType(IOpcSignatureReference* This,LPWSTR *type) {
    return This->lpVtbl->GetType(This,type);
}
static FORCEINLINE HRESULT IOpcSignatureReference_GetTransformMethod(IOpcSignatureReference* This,OPC_CANONICALIZATION_METHOD *transformMethod) {
    return This->lpVtbl->GetTransformMethod(This,transformMethod);
}
static FORCEINLINE HRESULT IOpcSignatureReference_GetDigestMethod(IOpcSignatureReference* This,LPWSTR *digestMethod) {
    return This->lpVtbl->GetDigestMethod(This,digestMethod);
}
static FORCEINLINE HRESULT IOpcSignatureReference_GetDigestValue(IOpcSignatureReference* This,UINT8 **digestValue,UINT32 *count) {
    return This->lpVtbl->GetDigestValue(This,digestValue,count);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureReference_GetId_Proxy(
    IOpcSignatureReference* This,
    LPWSTR *referenceId);
void __RPC_STUB IOpcSignatureReference_GetId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReference_GetUri_Proxy(
    IOpcSignatureReference* This,
    IUri **referenceUri);
void __RPC_STUB IOpcSignatureReference_GetUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReference_GetType_Proxy(
    IOpcSignatureReference* This,
    LPWSTR *type);
void __RPC_STUB IOpcSignatureReference_GetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReference_GetTransformMethod_Proxy(
    IOpcSignatureReference* This,
    OPC_CANONICALIZATION_METHOD *transformMethod);
void __RPC_STUB IOpcSignatureReference_GetTransformMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReference_GetDigestMethod_Proxy(
    IOpcSignatureReference* This,
    LPWSTR *digestMethod);
void __RPC_STUB IOpcSignatureReference_GetDigestMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReference_GetDigestValue_Proxy(
    IOpcSignatureReference* This,
    UINT8 **digestValue,
    UINT32 *count);
void __RPC_STUB IOpcSignatureReference_GetDigestValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureReference_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureReferenceEnumerator interface
 */
#ifndef __IOpcSignatureReferenceEnumerator_INTERFACE_DEFINED__
#define __IOpcSignatureReferenceEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureReferenceEnumerator, 0xcfa59a45, 0x28b1, 0x4868, 0x96,0x9e, 0xfa,0x80,0x97,0xfd,0xc1,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cfa59a45-28b1-4868-969e-fa8097fdc12a")
IOpcSignatureReferenceEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        IOpcSignatureReference **reference) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcSignatureReferenceEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureReferenceEnumerator, 0xcfa59a45, 0x28b1, 0x4868, 0x96,0x9e, 0xfa,0x80,0x97,0xfd,0xc1,0x2a)
#endif
#else
typedef struct IOpcSignatureReferenceEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureReferenceEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcSignatureReferenceEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcSignatureReferenceEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcSignatureReferenceEnumerator* This,
        IOpcSignatureReference **reference);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcSignatureReferenceEnumerator* This,
        IOpcSignatureReferenceEnumerator **copy);

    END_INTERFACE
} IOpcSignatureReferenceEnumeratorVtbl;
interface IOpcSignatureReferenceEnumerator {
    CONST_VTBL IOpcSignatureReferenceEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureReferenceEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureReferenceEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureReferenceEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureReferenceEnumerator methods ***/
#define IOpcSignatureReferenceEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcSignatureReferenceEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcSignatureReferenceEnumerator_GetCurrent(This,reference) (This)->lpVtbl->GetCurrent(This,reference)
#define IOpcSignatureReferenceEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureReferenceEnumerator_QueryInterface(IOpcSignatureReferenceEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureReferenceEnumerator_AddRef(IOpcSignatureReferenceEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureReferenceEnumerator_Release(IOpcSignatureReferenceEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureReferenceEnumerator methods ***/
static FORCEINLINE HRESULT IOpcSignatureReferenceEnumerator_MoveNext(IOpcSignatureReferenceEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcSignatureReferenceEnumerator_MovePrevious(IOpcSignatureReferenceEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcSignatureReferenceEnumerator_GetCurrent(IOpcSignatureReferenceEnumerator* This,IOpcSignatureReference **reference) {
    return This->lpVtbl->GetCurrent(This,reference);
}
static FORCEINLINE HRESULT IOpcSignatureReferenceEnumerator_Clone(IOpcSignatureReferenceEnumerator* This,IOpcSignatureReferenceEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureReferenceEnumerator_MoveNext_Proxy(
    IOpcSignatureReferenceEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcSignatureReferenceEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReferenceEnumerator_MovePrevious_Proxy(
    IOpcSignatureReferenceEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcSignatureReferenceEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReferenceEnumerator_GetCurrent_Proxy(
    IOpcSignatureReferenceEnumerator* This,
    IOpcSignatureReference **reference);
void __RPC_STUB IOpcSignatureReferenceEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReferenceEnumerator_Clone_Proxy(
    IOpcSignatureReferenceEnumerator* This,
    IOpcSignatureReferenceEnumerator **copy);
void __RPC_STUB IOpcSignatureReferenceEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureReferenceEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureRelationshipReferenceEnumerator interface
 */
#ifndef __IOpcSignatureRelationshipReferenceEnumerator_INTERFACE_DEFINED__
#define __IOpcSignatureRelationshipReferenceEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureRelationshipReferenceEnumerator, 0x773ba3e4, 0xf021, 0x48e4, 0xaa,0x04, 0x98,0x16,0xdb,0x5d,0x34,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("773ba3e4-f021-48e4-aa04-9816db5d3495")
IOpcSignatureRelationshipReferenceEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        IOpcSignatureRelationshipReference **relationshipReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcSignatureRelationshipReferenceEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureRelationshipReferenceEnumerator, 0x773ba3e4, 0xf021, 0x48e4, 0xaa,0x04, 0x98,0x16,0xdb,0x5d,0x34,0x95)
#endif
#else
typedef struct IOpcSignatureRelationshipReferenceEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureRelationshipReferenceEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcSignatureRelationshipReferenceEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcSignatureRelationshipReferenceEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcSignatureRelationshipReferenceEnumerator* This,
        IOpcSignatureRelationshipReference **relationshipReference);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcSignatureRelationshipReferenceEnumerator* This,
        IOpcSignatureRelationshipReferenceEnumerator **copy);

    END_INTERFACE
} IOpcSignatureRelationshipReferenceEnumeratorVtbl;
interface IOpcSignatureRelationshipReferenceEnumerator {
    CONST_VTBL IOpcSignatureRelationshipReferenceEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureRelationshipReferenceEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureRelationshipReferenceEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureRelationshipReferenceEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureRelationshipReferenceEnumerator methods ***/
#define IOpcSignatureRelationshipReferenceEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcSignatureRelationshipReferenceEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcSignatureRelationshipReferenceEnumerator_GetCurrent(This,relationshipReference) (This)->lpVtbl->GetCurrent(This,relationshipReference)
#define IOpcSignatureRelationshipReferenceEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceEnumerator_QueryInterface(IOpcSignatureRelationshipReferenceEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureRelationshipReferenceEnumerator_AddRef(IOpcSignatureRelationshipReferenceEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureRelationshipReferenceEnumerator_Release(IOpcSignatureRelationshipReferenceEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureRelationshipReferenceEnumerator methods ***/
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceEnumerator_MoveNext(IOpcSignatureRelationshipReferenceEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceEnumerator_MovePrevious(IOpcSignatureRelationshipReferenceEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceEnumerator_GetCurrent(IOpcSignatureRelationshipReferenceEnumerator* This,IOpcSignatureRelationshipReference **relationshipReference) {
    return This->lpVtbl->GetCurrent(This,relationshipReference);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceEnumerator_Clone(IOpcSignatureRelationshipReferenceEnumerator* This,IOpcSignatureRelationshipReferenceEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReferenceEnumerator_MoveNext_Proxy(
    IOpcSignatureRelationshipReferenceEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcSignatureRelationshipReferenceEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReferenceEnumerator_MovePrevious_Proxy(
    IOpcSignatureRelationshipReferenceEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcSignatureRelationshipReferenceEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReferenceEnumerator_GetCurrent_Proxy(
    IOpcSignatureRelationshipReferenceEnumerator* This,
    IOpcSignatureRelationshipReference **relationshipReference);
void __RPC_STUB IOpcSignatureRelationshipReferenceEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReferenceEnumerator_Clone_Proxy(
    IOpcSignatureRelationshipReferenceEnumerator* This,
    IOpcSignatureRelationshipReferenceEnumerator **copy);
void __RPC_STUB IOpcSignatureRelationshipReferenceEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureRelationshipReferenceEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureRelationshipReference interface
 */
#ifndef __IOpcSignatureRelationshipReference_INTERFACE_DEFINED__
#define __IOpcSignatureRelationshipReference_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureRelationshipReference, 0x57babac6, 0x9d4a, 0x4e50, 0x8b,0x86, 0xe5,0xd4,0x05,0x1e,0xae,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("57babac6-9d4a-4e50-8b86-e5d4051eae7c")
IOpcSignatureRelationshipReference : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSourceUri(
        IOpcUri **sourceUri) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetDigestValue(
        UINT8 **digestValue,
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformMethod(
        OPC_CANONICALIZATION_METHOD *transformMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRelationshipSigningOption(
        OPC_RELATIONSHIPS_SIGNING_OPTION *relationshipSigningOption) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRelationshipSelectorEnumerator(
        IOpcRelationshipSelectorEnumerator **selectorEnumerator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureRelationshipReference, 0x57babac6, 0x9d4a, 0x4e50, 0x8b,0x86, 0xe5,0xd4,0x05,0x1e,0xae,0x7c)
#endif
#else
typedef struct IOpcSignatureRelationshipReferenceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureRelationshipReference methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSourceUri)(
        IOpcSignatureRelationshipReference* This,
        IOpcUri **sourceUri);

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

    HRESULT (STDMETHODCALLTYPE *GetDigestValue)(
        IOpcSignatureRelationshipReference* This,
        UINT8 **digestValue,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetTransformMethod)(
        IOpcSignatureRelationshipReference* This,
        OPC_CANONICALIZATION_METHOD *transformMethod);

    HRESULT (STDMETHODCALLTYPE *GetRelationshipSigningOption)(
        IOpcSignatureRelationshipReference* This,
        OPC_RELATIONSHIPS_SIGNING_OPTION *relationshipSigningOption);

    HRESULT (STDMETHODCALLTYPE *GetRelationshipSelectorEnumerator)(
        IOpcSignatureRelationshipReference* This,
        IOpcRelationshipSelectorEnumerator **selectorEnumerator);

    END_INTERFACE
} IOpcSignatureRelationshipReferenceVtbl;
interface IOpcSignatureRelationshipReference {
    CONST_VTBL IOpcSignatureRelationshipReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureRelationshipReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureRelationshipReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureRelationshipReference_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureRelationshipReference methods ***/
#define IOpcSignatureRelationshipReference_GetSourceUri(This,sourceUri) (This)->lpVtbl->GetSourceUri(This,sourceUri)
#define IOpcSignatureRelationshipReference_GetDigestMethod(This,digestMethod) (This)->lpVtbl->GetDigestMethod(This,digestMethod)
#define IOpcSignatureRelationshipReference_GetDigestValue(This,digestValue,count) (This)->lpVtbl->GetDigestValue(This,digestValue,count)
#define IOpcSignatureRelationshipReference_GetTransformMethod(This,transformMethod) (This)->lpVtbl->GetTransformMethod(This,transformMethod)
#define IOpcSignatureRelationshipReference_GetRelationshipSigningOption(This,relationshipSigningOption) (This)->lpVtbl->GetRelationshipSigningOption(This,relationshipSigningOption)
#define IOpcSignatureRelationshipReference_GetRelationshipSelectorEnumerator(This,selectorEnumerator) (This)->lpVtbl->GetRelationshipSelectorEnumerator(This,selectorEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureRelationshipReference_QueryInterface(IOpcSignatureRelationshipReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureRelationshipReference_AddRef(IOpcSignatureRelationshipReference* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureRelationshipReference_Release(IOpcSignatureRelationshipReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureRelationshipReference methods ***/
static FORCEINLINE HRESULT IOpcSignatureRelationshipReference_GetSourceUri(IOpcSignatureRelationshipReference* This,IOpcUri **sourceUri) {
    return This->lpVtbl->GetSourceUri(This,sourceUri);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReference_GetDigestMethod(IOpcSignatureRelationshipReference* This,LPWSTR *digestMethod) {
    return This->lpVtbl->GetDigestMethod(This,digestMethod);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReference_GetDigestValue(IOpcSignatureRelationshipReference* This,UINT8 **digestValue,UINT32 *count) {
    return This->lpVtbl->GetDigestValue(This,digestValue,count);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReference_GetTransformMethod(IOpcSignatureRelationshipReference* This,OPC_CANONICALIZATION_METHOD *transformMethod) {
    return This->lpVtbl->GetTransformMethod(This,transformMethod);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReference_GetRelationshipSigningOption(IOpcSignatureRelationshipReference* This,OPC_RELATIONSHIPS_SIGNING_OPTION *relationshipSigningOption) {
    return This->lpVtbl->GetRelationshipSigningOption(This,relationshipSigningOption);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReference_GetRelationshipSelectorEnumerator(IOpcSignatureRelationshipReference* This,IOpcRelationshipSelectorEnumerator **selectorEnumerator) {
    return This->lpVtbl->GetRelationshipSelectorEnumerator(This,selectorEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReference_GetSourceUri_Proxy(
    IOpcSignatureRelationshipReference* This,
    IOpcUri **sourceUri);
void __RPC_STUB IOpcSignatureRelationshipReference_GetSourceUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReference_GetDigestMethod_Proxy(
    IOpcSignatureRelationshipReference* This,
    LPWSTR *digestMethod);
void __RPC_STUB IOpcSignatureRelationshipReference_GetDigestMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReference_GetDigestValue_Proxy(
    IOpcSignatureRelationshipReference* This,
    UINT8 **digestValue,
    UINT32 *count);
void __RPC_STUB IOpcSignatureRelationshipReference_GetDigestValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReference_GetTransformMethod_Proxy(
    IOpcSignatureRelationshipReference* This,
    OPC_CANONICALIZATION_METHOD *transformMethod);
void __RPC_STUB IOpcSignatureRelationshipReference_GetTransformMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReference_GetRelationshipSigningOption_Proxy(
    IOpcSignatureRelationshipReference* This,
    OPC_RELATIONSHIPS_SIGNING_OPTION *relationshipSigningOption);
void __RPC_STUB IOpcSignatureRelationshipReference_GetRelationshipSigningOption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReference_GetRelationshipSelectorEnumerator_Proxy(
    IOpcSignatureRelationshipReference* This,
    IOpcRelationshipSelectorEnumerator **selectorEnumerator);
void __RPC_STUB IOpcSignatureRelationshipReference_GetRelationshipSelectorEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureRelationshipReference_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcRelationshipSelectorEnumerator interface
 */
#ifndef __IOpcRelationshipSelectorEnumerator_INTERFACE_DEFINED__
#define __IOpcRelationshipSelectorEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcRelationshipSelectorEnumerator, 0x5e50a181, 0xa91b, 0x48ac, 0x88,0xd2, 0xbc,0xa3,0xd8,0xf8,0xc0,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5e50a181-a91b-48ac-88d2-bca3d8f8c0b1")
IOpcRelationshipSelectorEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        IOpcRelationshipSelector **relationshipSelector) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcRelationshipSelectorEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcRelationshipSelectorEnumerator, 0x5e50a181, 0xa91b, 0x48ac, 0x88,0xd2, 0xbc,0xa3,0xd8,0xf8,0xc0,0xb1)
#endif
#else
typedef struct IOpcRelationshipSelectorEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcRelationshipSelectorEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcRelationshipSelectorEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcRelationshipSelectorEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcRelationshipSelectorEnumerator* This,
        IOpcRelationshipSelector **relationshipSelector);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcRelationshipSelectorEnumerator* This,
        IOpcRelationshipSelectorEnumerator **copy);

    END_INTERFACE
} IOpcRelationshipSelectorEnumeratorVtbl;
interface IOpcRelationshipSelectorEnumerator {
    CONST_VTBL IOpcRelationshipSelectorEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcRelationshipSelectorEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcRelationshipSelectorEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcRelationshipSelectorEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcRelationshipSelectorEnumerator methods ***/
#define IOpcRelationshipSelectorEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcRelationshipSelectorEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcRelationshipSelectorEnumerator_GetCurrent(This,relationshipSelector) (This)->lpVtbl->GetCurrent(This,relationshipSelector)
#define IOpcRelationshipSelectorEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcRelationshipSelectorEnumerator_QueryInterface(IOpcRelationshipSelectorEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcRelationshipSelectorEnumerator_AddRef(IOpcRelationshipSelectorEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcRelationshipSelectorEnumerator_Release(IOpcRelationshipSelectorEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcRelationshipSelectorEnumerator methods ***/
static FORCEINLINE HRESULT IOpcRelationshipSelectorEnumerator_MoveNext(IOpcRelationshipSelectorEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcRelationshipSelectorEnumerator_MovePrevious(IOpcRelationshipSelectorEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcRelationshipSelectorEnumerator_GetCurrent(IOpcRelationshipSelectorEnumerator* This,IOpcRelationshipSelector **relationshipSelector) {
    return This->lpVtbl->GetCurrent(This,relationshipSelector);
}
static FORCEINLINE HRESULT IOpcRelationshipSelectorEnumerator_Clone(IOpcRelationshipSelectorEnumerator* This,IOpcRelationshipSelectorEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcRelationshipSelectorEnumerator_MoveNext_Proxy(
    IOpcRelationshipSelectorEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcRelationshipSelectorEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSelectorEnumerator_MovePrevious_Proxy(
    IOpcRelationshipSelectorEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcRelationshipSelectorEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSelectorEnumerator_GetCurrent_Proxy(
    IOpcRelationshipSelectorEnumerator* This,
    IOpcRelationshipSelector **relationshipSelector);
void __RPC_STUB IOpcRelationshipSelectorEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSelectorEnumerator_Clone_Proxy(
    IOpcRelationshipSelectorEnumerator* This,
    IOpcRelationshipSelectorEnumerator **copy);
void __RPC_STUB IOpcRelationshipSelectorEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcRelationshipSelectorEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcCertificateEnumerator interface
 */
#ifndef __IOpcCertificateEnumerator_INTERFACE_DEFINED__
#define __IOpcCertificateEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcCertificateEnumerator, 0x85131937, 0x8f24, 0x421f, 0xb4,0x39, 0x59,0xab,0x24,0xd1,0x40,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("85131937-8f24-421f-b439-59ab24d140b8")
IOpcCertificateEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        const CERT_CONTEXT **certificate) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcCertificateEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcCertificateEnumerator, 0x85131937, 0x8f24, 0x421f, 0xb4,0x39, 0x59,0xab,0x24,0xd1,0x40,0xb8)
#endif
#else
typedef struct IOpcCertificateEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcCertificateEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcCertificateEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcCertificateEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcCertificateEnumerator* This,
        const CERT_CONTEXT **certificate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcCertificateEnumerator* This,
        IOpcCertificateEnumerator **copy);

    END_INTERFACE
} IOpcCertificateEnumeratorVtbl;
interface IOpcCertificateEnumerator {
    CONST_VTBL IOpcCertificateEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcCertificateEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcCertificateEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcCertificateEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcCertificateEnumerator methods ***/
#define IOpcCertificateEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcCertificateEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcCertificateEnumerator_GetCurrent(This,certificate) (This)->lpVtbl->GetCurrent(This,certificate)
#define IOpcCertificateEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcCertificateEnumerator_QueryInterface(IOpcCertificateEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcCertificateEnumerator_AddRef(IOpcCertificateEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcCertificateEnumerator_Release(IOpcCertificateEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcCertificateEnumerator methods ***/
static FORCEINLINE HRESULT IOpcCertificateEnumerator_MoveNext(IOpcCertificateEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcCertificateEnumerator_MovePrevious(IOpcCertificateEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcCertificateEnumerator_GetCurrent(IOpcCertificateEnumerator* This,const CERT_CONTEXT **certificate) {
    return This->lpVtbl->GetCurrent(This,certificate);
}
static FORCEINLINE HRESULT IOpcCertificateEnumerator_Clone(IOpcCertificateEnumerator* This,IOpcCertificateEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcCertificateEnumerator_MoveNext_Proxy(
    IOpcCertificateEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcCertificateEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcCertificateEnumerator_MovePrevious_Proxy(
    IOpcCertificateEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcCertificateEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcCertificateEnumerator_GetCurrent_Proxy(
    IOpcCertificateEnumerator* This,
    const CERT_CONTEXT **certificate);
void __RPC_STUB IOpcCertificateEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcCertificateEnumerator_Clone_Proxy(
    IOpcCertificateEnumerator* This,
    IOpcCertificateEnumerator **copy);
void __RPC_STUB IOpcCertificateEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcCertificateEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcCertificateSet interface
 */
#ifndef __IOpcCertificateSet_INTERFACE_DEFINED__
#define __IOpcCertificateSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcCertificateSet, 0x56ea4325, 0x8e2d, 0x4167, 0xb1,0xa4, 0xe4,0x86,0xd2,0x4c,0x8f,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56ea4325-8e2d-4167-b1a4-e486d24c8fa7")
IOpcCertificateSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Add(
        const CERT_CONTEXT *certificate) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        const CERT_CONTEXT *certificate) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcCertificateSet, 0x56ea4325, 0x8e2d, 0x4167, 0xb1,0xa4, 0xe4,0x86,0xd2,0x4c,0x8f,0xa7)
#endif
#else
typedef struct IOpcCertificateSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcCertificateSet methods ***/
    HRESULT (STDMETHODCALLTYPE *Add)(
        IOpcCertificateSet* This,
        const CERT_CONTEXT *certificate);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IOpcCertificateSet* This,
        const CERT_CONTEXT *certificate);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IOpcCertificateSet* This,
        IOpcCertificateEnumerator **certificateEnumerator);

    END_INTERFACE
} IOpcCertificateSetVtbl;
interface IOpcCertificateSet {
    CONST_VTBL IOpcCertificateSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcCertificateSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcCertificateSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcCertificateSet_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcCertificateSet methods ***/
#define IOpcCertificateSet_Add(This,certificate) (This)->lpVtbl->Add(This,certificate)
#define IOpcCertificateSet_Remove(This,certificate) (This)->lpVtbl->Remove(This,certificate)
#define IOpcCertificateSet_GetEnumerator(This,certificateEnumerator) (This)->lpVtbl->GetEnumerator(This,certificateEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcCertificateSet_QueryInterface(IOpcCertificateSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcCertificateSet_AddRef(IOpcCertificateSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcCertificateSet_Release(IOpcCertificateSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcCertificateSet methods ***/
static FORCEINLINE HRESULT IOpcCertificateSet_Add(IOpcCertificateSet* This,const CERT_CONTEXT *certificate) {
    return This->lpVtbl->Add(This,certificate);
}
static FORCEINLINE HRESULT IOpcCertificateSet_Remove(IOpcCertificateSet* This,const CERT_CONTEXT *certificate) {
    return This->lpVtbl->Remove(This,certificate);
}
static FORCEINLINE HRESULT IOpcCertificateSet_GetEnumerator(IOpcCertificateSet* This,IOpcCertificateEnumerator **certificateEnumerator) {
    return This->lpVtbl->GetEnumerator(This,certificateEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcCertificateSet_Add_Proxy(
    IOpcCertificateSet* This,
    const CERT_CONTEXT *certificate);
void __RPC_STUB IOpcCertificateSet_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcCertificateSet_Remove_Proxy(
    IOpcCertificateSet* This,
    const CERT_CONTEXT *certificate);
void __RPC_STUB IOpcCertificateSet_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcCertificateSet_GetEnumerator_Proxy(
    IOpcCertificateSet* This,
    IOpcCertificateEnumerator **certificateEnumerator);
void __RPC_STUB IOpcCertificateSet_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcCertificateSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcDigitalSignatureEnumerator interface
 */
#ifndef __IOpcDigitalSignatureEnumerator_INTERFACE_DEFINED__
#define __IOpcDigitalSignatureEnumerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcDigitalSignatureEnumerator, 0x967b6882, 0x0ba3, 0x4358, 0xb9,0xe7, 0xb6,0x4c,0x75,0x06,0x3c,0x5e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("967b6882-0ba3-4358-b9e7-b64c75063c5e")
IOpcDigitalSignatureEnumerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE MoveNext(
        WINBOOL *hasNext) = 0;

    virtual HRESULT STDMETHODCALLTYPE MovePrevious(
        WINBOOL *hasPrevious) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrent(
        IOpcDigitalSignature **digitalSignature) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IOpcDigitalSignatureEnumerator **copy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcDigitalSignatureEnumerator, 0x967b6882, 0x0ba3, 0x4358, 0xb9,0xe7, 0xb6,0x4c,0x75,0x06,0x3c,0x5e)
#endif
#else
typedef struct IOpcDigitalSignatureEnumeratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcDigitalSignatureEnumerator methods ***/
    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        IOpcDigitalSignatureEnumerator* This,
        WINBOOL *hasNext);

    HRESULT (STDMETHODCALLTYPE *MovePrevious)(
        IOpcDigitalSignatureEnumerator* This,
        WINBOOL *hasPrevious);

    HRESULT (STDMETHODCALLTYPE *GetCurrent)(
        IOpcDigitalSignatureEnumerator* This,
        IOpcDigitalSignature **digitalSignature);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IOpcDigitalSignatureEnumerator* This,
        IOpcDigitalSignatureEnumerator **copy);

    END_INTERFACE
} IOpcDigitalSignatureEnumeratorVtbl;
interface IOpcDigitalSignatureEnumerator {
    CONST_VTBL IOpcDigitalSignatureEnumeratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcDigitalSignatureEnumerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcDigitalSignatureEnumerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcDigitalSignatureEnumerator_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcDigitalSignatureEnumerator methods ***/
#define IOpcDigitalSignatureEnumerator_MoveNext(This,hasNext) (This)->lpVtbl->MoveNext(This,hasNext)
#define IOpcDigitalSignatureEnumerator_MovePrevious(This,hasPrevious) (This)->lpVtbl->MovePrevious(This,hasPrevious)
#define IOpcDigitalSignatureEnumerator_GetCurrent(This,digitalSignature) (This)->lpVtbl->GetCurrent(This,digitalSignature)
#define IOpcDigitalSignatureEnumerator_Clone(This,copy) (This)->lpVtbl->Clone(This,copy)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcDigitalSignatureEnumerator_QueryInterface(IOpcDigitalSignatureEnumerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcDigitalSignatureEnumerator_AddRef(IOpcDigitalSignatureEnumerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcDigitalSignatureEnumerator_Release(IOpcDigitalSignatureEnumerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcDigitalSignatureEnumerator methods ***/
static FORCEINLINE HRESULT IOpcDigitalSignatureEnumerator_MoveNext(IOpcDigitalSignatureEnumerator* This,WINBOOL *hasNext) {
    return This->lpVtbl->MoveNext(This,hasNext);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureEnumerator_MovePrevious(IOpcDigitalSignatureEnumerator* This,WINBOOL *hasPrevious) {
    return This->lpVtbl->MovePrevious(This,hasPrevious);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureEnumerator_GetCurrent(IOpcDigitalSignatureEnumerator* This,IOpcDigitalSignature **digitalSignature) {
    return This->lpVtbl->GetCurrent(This,digitalSignature);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureEnumerator_Clone(IOpcDigitalSignatureEnumerator* This,IOpcDigitalSignatureEnumerator **copy) {
    return This->lpVtbl->Clone(This,copy);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureEnumerator_MoveNext_Proxy(
    IOpcDigitalSignatureEnumerator* This,
    WINBOOL *hasNext);
void __RPC_STUB IOpcDigitalSignatureEnumerator_MoveNext_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureEnumerator_MovePrevious_Proxy(
    IOpcDigitalSignatureEnumerator* This,
    WINBOOL *hasPrevious);
void __RPC_STUB IOpcDigitalSignatureEnumerator_MovePrevious_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureEnumerator_GetCurrent_Proxy(
    IOpcDigitalSignatureEnumerator* This,
    IOpcDigitalSignature **digitalSignature);
void __RPC_STUB IOpcDigitalSignatureEnumerator_GetCurrent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureEnumerator_Clone_Proxy(
    IOpcDigitalSignatureEnumerator* This,
    IOpcDigitalSignatureEnumerator **copy);
void __RPC_STUB IOpcDigitalSignatureEnumerator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcDigitalSignatureEnumerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcDigitalSignatureManager interface
 */
#ifndef __IOpcDigitalSignatureManager_INTERFACE_DEFINED__
#define __IOpcDigitalSignatureManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcDigitalSignatureManager, 0xd5e62a0b, 0x696d, 0x462f, 0x94,0xdf, 0x72,0xe3,0x3c,0xef,0x26,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d5e62a0b-696d-462f-94df-72e33cef2659")
IOpcDigitalSignatureManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSignatureOriginPartName(
        IOpcPartUri **signatureOriginPartName) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetSignatureEnumerator(
        IOpcDigitalSignatureEnumerator **signatureEnumerator) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE Validate(
        IOpcDigitalSignature *signature,
        const CERT_CONTEXT *certificate,
        OPC_SIGNATURE_VALIDATION_RESULT *validationResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE Sign(
        const CERT_CONTEXT *certificate,
        IOpcSigningOptions *signingOptions,
        IOpcDigitalSignature **digitalSignature) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReplaceSignatureXml(
        IOpcPartUri *signaturePartName,
        const UINT8 *newSignatureXml,
        UINT32 count,
        IOpcDigitalSignature **digitalSignature) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcDigitalSignatureManager, 0xd5e62a0b, 0x696d, 0x462f, 0x94,0xdf, 0x72,0xe3,0x3c,0xef,0x26,0x59)
#endif
#else
typedef struct IOpcDigitalSignatureManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcDigitalSignatureManager methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSignatureOriginPartName)(
        IOpcDigitalSignatureManager* This,
        IOpcPartUri **signatureOriginPartName);

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

    HRESULT (STDMETHODCALLTYPE *GetSignatureEnumerator)(
        IOpcDigitalSignatureManager* This,
        IOpcDigitalSignatureEnumerator **signatureEnumerator);

    HRESULT (STDMETHODCALLTYPE *RemoveSignature)(
        IOpcDigitalSignatureManager* This,
        IOpcPartUri *signaturePartName);

    HRESULT (STDMETHODCALLTYPE *CreateSigningOptions)(
        IOpcDigitalSignatureManager* This,
        IOpcSigningOptions **signingOptions);

    HRESULT (STDMETHODCALLTYPE *Validate)(
        IOpcDigitalSignatureManager* This,
        IOpcDigitalSignature *signature,
        const CERT_CONTEXT *certificate,
        OPC_SIGNATURE_VALIDATION_RESULT *validationResult);

    HRESULT (STDMETHODCALLTYPE *Sign)(
        IOpcDigitalSignatureManager* This,
        const CERT_CONTEXT *certificate,
        IOpcSigningOptions *signingOptions,
        IOpcDigitalSignature **digitalSignature);

    HRESULT (STDMETHODCALLTYPE *ReplaceSignatureXml)(
        IOpcDigitalSignatureManager* This,
        IOpcPartUri *signaturePartName,
        const UINT8 *newSignatureXml,
        UINT32 count,
        IOpcDigitalSignature **digitalSignature);

    END_INTERFACE
} IOpcDigitalSignatureManagerVtbl;
interface IOpcDigitalSignatureManager {
    CONST_VTBL IOpcDigitalSignatureManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcDigitalSignatureManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcDigitalSignatureManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcDigitalSignatureManager_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcDigitalSignatureManager methods ***/
#define IOpcDigitalSignatureManager_GetSignatureOriginPartName(This,signatureOriginPartName) (This)->lpVtbl->GetSignatureOriginPartName(This,signatureOriginPartName)
#define IOpcDigitalSignatureManager_SetSignatureOriginPartName(This,signatureOriginPartName) (This)->lpVtbl->SetSignatureOriginPartName(This,signatureOriginPartName)
#define IOpcDigitalSignatureManager_GetSignatureEnumerator(This,signatureEnumerator) (This)->lpVtbl->GetSignatureEnumerator(This,signatureEnumerator)
#define IOpcDigitalSignatureManager_RemoveSignature(This,signaturePartName) (This)->lpVtbl->RemoveSignature(This,signaturePartName)
#define IOpcDigitalSignatureManager_CreateSigningOptions(This,signingOptions) (This)->lpVtbl->CreateSigningOptions(This,signingOptions)
#define IOpcDigitalSignatureManager_Validate(This,signature,certificate,validationResult) (This)->lpVtbl->Validate(This,signature,certificate,validationResult)
#define IOpcDigitalSignatureManager_Sign(This,certificate,signingOptions,digitalSignature) (This)->lpVtbl->Sign(This,certificate,signingOptions,digitalSignature)
#define IOpcDigitalSignatureManager_ReplaceSignatureXml(This,signaturePartName,newSignatureXml,count,digitalSignature) (This)->lpVtbl->ReplaceSignatureXml(This,signaturePartName,newSignatureXml,count,digitalSignature)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_QueryInterface(IOpcDigitalSignatureManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcDigitalSignatureManager_AddRef(IOpcDigitalSignatureManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcDigitalSignatureManager_Release(IOpcDigitalSignatureManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcDigitalSignatureManager methods ***/
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_GetSignatureOriginPartName(IOpcDigitalSignatureManager* This,IOpcPartUri **signatureOriginPartName) {
    return This->lpVtbl->GetSignatureOriginPartName(This,signatureOriginPartName);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_SetSignatureOriginPartName(IOpcDigitalSignatureManager* This,IOpcPartUri *signatureOriginPartName) {
    return This->lpVtbl->SetSignatureOriginPartName(This,signatureOriginPartName);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_GetSignatureEnumerator(IOpcDigitalSignatureManager* This,IOpcDigitalSignatureEnumerator **signatureEnumerator) {
    return This->lpVtbl->GetSignatureEnumerator(This,signatureEnumerator);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_RemoveSignature(IOpcDigitalSignatureManager* This,IOpcPartUri *signaturePartName) {
    return This->lpVtbl->RemoveSignature(This,signaturePartName);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_CreateSigningOptions(IOpcDigitalSignatureManager* This,IOpcSigningOptions **signingOptions) {
    return This->lpVtbl->CreateSigningOptions(This,signingOptions);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_Validate(IOpcDigitalSignatureManager* This,IOpcDigitalSignature *signature,const CERT_CONTEXT *certificate,OPC_SIGNATURE_VALIDATION_RESULT *validationResult) {
    return This->lpVtbl->Validate(This,signature,certificate,validationResult);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_Sign(IOpcDigitalSignatureManager* This,const CERT_CONTEXT *certificate,IOpcSigningOptions *signingOptions,IOpcDigitalSignature **digitalSignature) {
    return This->lpVtbl->Sign(This,certificate,signingOptions,digitalSignature);
}
static FORCEINLINE HRESULT IOpcDigitalSignatureManager_ReplaceSignatureXml(IOpcDigitalSignatureManager* This,IOpcPartUri *signaturePartName,const UINT8 *newSignatureXml,UINT32 count,IOpcDigitalSignature **digitalSignature) {
    return This->lpVtbl->ReplaceSignatureXml(This,signaturePartName,newSignatureXml,count,digitalSignature);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureManager_GetSignatureOriginPartName_Proxy(
    IOpcDigitalSignatureManager* This,
    IOpcPartUri **signatureOriginPartName);
void __RPC_STUB IOpcDigitalSignatureManager_GetSignatureOriginPartName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureManager_SetSignatureOriginPartName_Proxy(
    IOpcDigitalSignatureManager* This,
    IOpcPartUri *signatureOriginPartName);
void __RPC_STUB IOpcDigitalSignatureManager_SetSignatureOriginPartName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureManager_GetSignatureEnumerator_Proxy(
    IOpcDigitalSignatureManager* This,
    IOpcDigitalSignatureEnumerator **signatureEnumerator);
void __RPC_STUB IOpcDigitalSignatureManager_GetSignatureEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureManager_RemoveSignature_Proxy(
    IOpcDigitalSignatureManager* This,
    IOpcPartUri *signaturePartName);
void __RPC_STUB IOpcDigitalSignatureManager_RemoveSignature_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureManager_CreateSigningOptions_Proxy(
    IOpcDigitalSignatureManager* This,
    IOpcSigningOptions **signingOptions);
void __RPC_STUB IOpcDigitalSignatureManager_CreateSigningOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureManager_Validate_Proxy(
    IOpcDigitalSignatureManager* This,
    IOpcDigitalSignature *signature,
    const CERT_CONTEXT *certificate,
    OPC_SIGNATURE_VALIDATION_RESULT *validationResult);
void __RPC_STUB IOpcDigitalSignatureManager_Validate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureManager_Sign_Proxy(
    IOpcDigitalSignatureManager* This,
    const CERT_CONTEXT *certificate,
    IOpcSigningOptions *signingOptions,
    IOpcDigitalSignature **digitalSignature);
void __RPC_STUB IOpcDigitalSignatureManager_Sign_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignatureManager_ReplaceSignatureXml_Proxy(
    IOpcDigitalSignatureManager* This,
    IOpcPartUri *signaturePartName,
    const UINT8 *newSignatureXml,
    UINT32 count,
    IOpcDigitalSignature **digitalSignature);
void __RPC_STUB IOpcDigitalSignatureManager_ReplaceSignatureXml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcDigitalSignatureManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignaturePartReferenceSet interface
 */
#ifndef __IOpcSignaturePartReferenceSet_INTERFACE_DEFINED__
#define __IOpcSignaturePartReferenceSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignaturePartReferenceSet, 0x6c9fe28c, 0xecd9, 0x4b22, 0x9d,0x36, 0x7f,0xdd,0xe6,0x70,0xfe,0xc0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6c9fe28c-ecd9-4b22-9d36-7fdde670fec0")
IOpcSignaturePartReferenceSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Create(
        IOpcPartUri *partUri,
        LPCWSTR digestMethod,
        OPC_CANONICALIZATION_METHOD transformMethod,
        IOpcSignaturePartReference **partReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        IOpcSignaturePartReference *partReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumerator(
        IOpcSignaturePartReferenceEnumerator **partReferenceEnumerator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignaturePartReferenceSet, 0x6c9fe28c, 0xecd9, 0x4b22, 0x9d,0x36, 0x7f,0xdd,0xe6,0x70,0xfe,0xc0)
#endif
#else
typedef struct IOpcSignaturePartReferenceSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignaturePartReferenceSet methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        IOpcSignaturePartReferenceSet* This,
        IOpcPartUri *partUri,
        LPCWSTR digestMethod,
        OPC_CANONICALIZATION_METHOD transformMethod,
        IOpcSignaturePartReference **partReference);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IOpcSignaturePartReferenceSet* This,
        IOpcSignaturePartReference *partReference);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IOpcSignaturePartReferenceSet* This,
        IOpcSignaturePartReferenceEnumerator **partReferenceEnumerator);

    END_INTERFACE
} IOpcSignaturePartReferenceSetVtbl;
interface IOpcSignaturePartReferenceSet {
    CONST_VTBL IOpcSignaturePartReferenceSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignaturePartReferenceSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignaturePartReferenceSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignaturePartReferenceSet_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignaturePartReferenceSet methods ***/
#define IOpcSignaturePartReferenceSet_Create(This,partUri,digestMethod,transformMethod,partReference) (This)->lpVtbl->Create(This,partUri,digestMethod,transformMethod,partReference)
#define IOpcSignaturePartReferenceSet_Delete(This,partReference) (This)->lpVtbl->Delete(This,partReference)
#define IOpcSignaturePartReferenceSet_GetEnumerator(This,partReferenceEnumerator) (This)->lpVtbl->GetEnumerator(This,partReferenceEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignaturePartReferenceSet_QueryInterface(IOpcSignaturePartReferenceSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignaturePartReferenceSet_AddRef(IOpcSignaturePartReferenceSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignaturePartReferenceSet_Release(IOpcSignaturePartReferenceSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignaturePartReferenceSet methods ***/
static FORCEINLINE HRESULT IOpcSignaturePartReferenceSet_Create(IOpcSignaturePartReferenceSet* This,IOpcPartUri *partUri,LPCWSTR digestMethod,OPC_CANONICALIZATION_METHOD transformMethod,IOpcSignaturePartReference **partReference) {
    return This->lpVtbl->Create(This,partUri,digestMethod,transformMethod,partReference);
}
static FORCEINLINE HRESULT IOpcSignaturePartReferenceSet_Delete(IOpcSignaturePartReferenceSet* This,IOpcSignaturePartReference *partReference) {
    return This->lpVtbl->Delete(This,partReference);
}
static FORCEINLINE HRESULT IOpcSignaturePartReferenceSet_GetEnumerator(IOpcSignaturePartReferenceSet* This,IOpcSignaturePartReferenceEnumerator **partReferenceEnumerator) {
    return This->lpVtbl->GetEnumerator(This,partReferenceEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignaturePartReferenceSet_Create_Proxy(
    IOpcSignaturePartReferenceSet* This,
    IOpcPartUri *partUri,
    LPCWSTR digestMethod,
    OPC_CANONICALIZATION_METHOD transformMethod,
    IOpcSignaturePartReference **partReference);
void __RPC_STUB IOpcSignaturePartReferenceSet_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReferenceSet_Delete_Proxy(
    IOpcSignaturePartReferenceSet* This,
    IOpcSignaturePartReference *partReference);
void __RPC_STUB IOpcSignaturePartReferenceSet_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignaturePartReferenceSet_GetEnumerator_Proxy(
    IOpcSignaturePartReferenceSet* This,
    IOpcSignaturePartReferenceEnumerator **partReferenceEnumerator);
void __RPC_STUB IOpcSignaturePartReferenceSet_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignaturePartReferenceSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcRelationshipSelectorSet interface
 */
#ifndef __IOpcRelationshipSelectorSet_INTERFACE_DEFINED__
#define __IOpcRelationshipSelectorSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcRelationshipSelectorSet, 0x6e34c269, 0xa4d3, 0x47c0, 0xb5,0xc4, 0x87,0xff,0x2b,0x3b,0x61,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6e34c269-a4d3-47c0-b5c4-87ff2b3b6136")
IOpcRelationshipSelectorSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Create(
        OPC_RELATIONSHIP_SELECTOR selector,
        LPCWSTR selectionCriterion,
        IOpcRelationshipSelector **relationshipSelector) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        IOpcRelationshipSelector *relationshipSelector) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumerator(
        IOpcRelationshipSelectorEnumerator **relationshipSelectorEnumerator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcRelationshipSelectorSet, 0x6e34c269, 0xa4d3, 0x47c0, 0xb5,0xc4, 0x87,0xff,0x2b,0x3b,0x61,0x36)
#endif
#else
typedef struct IOpcRelationshipSelectorSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcRelationshipSelectorSet methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        IOpcRelationshipSelectorSet* This,
        OPC_RELATIONSHIP_SELECTOR selector,
        LPCWSTR selectionCriterion,
        IOpcRelationshipSelector **relationshipSelector);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IOpcRelationshipSelectorSet* This,
        IOpcRelationshipSelector *relationshipSelector);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IOpcRelationshipSelectorSet* This,
        IOpcRelationshipSelectorEnumerator **relationshipSelectorEnumerator);

    END_INTERFACE
} IOpcRelationshipSelectorSetVtbl;
interface IOpcRelationshipSelectorSet {
    CONST_VTBL IOpcRelationshipSelectorSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcRelationshipSelectorSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcRelationshipSelectorSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcRelationshipSelectorSet_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcRelationshipSelectorSet methods ***/
#define IOpcRelationshipSelectorSet_Create(This,selector,selectionCriterion,relationshipSelector) (This)->lpVtbl->Create(This,selector,selectionCriterion,relationshipSelector)
#define IOpcRelationshipSelectorSet_Delete(This,relationshipSelector) (This)->lpVtbl->Delete(This,relationshipSelector)
#define IOpcRelationshipSelectorSet_GetEnumerator(This,relationshipSelectorEnumerator) (This)->lpVtbl->GetEnumerator(This,relationshipSelectorEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcRelationshipSelectorSet_QueryInterface(IOpcRelationshipSelectorSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcRelationshipSelectorSet_AddRef(IOpcRelationshipSelectorSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcRelationshipSelectorSet_Release(IOpcRelationshipSelectorSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcRelationshipSelectorSet methods ***/
static FORCEINLINE HRESULT IOpcRelationshipSelectorSet_Create(IOpcRelationshipSelectorSet* This,OPC_RELATIONSHIP_SELECTOR selector,LPCWSTR selectionCriterion,IOpcRelationshipSelector **relationshipSelector) {
    return This->lpVtbl->Create(This,selector,selectionCriterion,relationshipSelector);
}
static FORCEINLINE HRESULT IOpcRelationshipSelectorSet_Delete(IOpcRelationshipSelectorSet* This,IOpcRelationshipSelector *relationshipSelector) {
    return This->lpVtbl->Delete(This,relationshipSelector);
}
static FORCEINLINE HRESULT IOpcRelationshipSelectorSet_GetEnumerator(IOpcRelationshipSelectorSet* This,IOpcRelationshipSelectorEnumerator **relationshipSelectorEnumerator) {
    return This->lpVtbl->GetEnumerator(This,relationshipSelectorEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcRelationshipSelectorSet_Create_Proxy(
    IOpcRelationshipSelectorSet* This,
    OPC_RELATIONSHIP_SELECTOR selector,
    LPCWSTR selectionCriterion,
    IOpcRelationshipSelector **relationshipSelector);
void __RPC_STUB IOpcRelationshipSelectorSet_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSelectorSet_Delete_Proxy(
    IOpcRelationshipSelectorSet* This,
    IOpcRelationshipSelector *relationshipSelector);
void __RPC_STUB IOpcRelationshipSelectorSet_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcRelationshipSelectorSet_GetEnumerator_Proxy(
    IOpcRelationshipSelectorSet* This,
    IOpcRelationshipSelectorEnumerator **relationshipSelectorEnumerator);
void __RPC_STUB IOpcRelationshipSelectorSet_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcRelationshipSelectorSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureRelationshipReferenceSet interface
 */
#ifndef __IOpcSignatureRelationshipReferenceSet_INTERFACE_DEFINED__
#define __IOpcSignatureRelationshipReferenceSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureRelationshipReferenceSet, 0x9f863ca5, 0x3631, 0x404c, 0x82,0x8d, 0x80,0x7e,0x07,0x15,0x06,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9f863ca5-3631-404c-828d-807e0715069b")
IOpcSignatureRelationshipReferenceSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Create(
        IOpcUri *sourceUri,
        LPCWSTR digestMethod,
        OPC_RELATIONSHIPS_SIGNING_OPTION relationshipSigningOption,
        IOpcRelationshipSelectorSet *selectorSet,
        OPC_CANONICALIZATION_METHOD transformMethod,
        IOpcSignatureRelationshipReference **relationshipReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRelationshipSelectorSet(
        IOpcRelationshipSelectorSet **selectorSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        IOpcSignatureRelationshipReference *relationshipReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumerator(
        IOpcSignatureRelationshipReferenceEnumerator **relationshipReferenceEnumerator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureRelationshipReferenceSet, 0x9f863ca5, 0x3631, 0x404c, 0x82,0x8d, 0x80,0x7e,0x07,0x15,0x06,0x9b)
#endif
#else
typedef struct IOpcSignatureRelationshipReferenceSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureRelationshipReferenceSet methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        IOpcSignatureRelationshipReferenceSet* This,
        IOpcUri *sourceUri,
        LPCWSTR digestMethod,
        OPC_RELATIONSHIPS_SIGNING_OPTION relationshipSigningOption,
        IOpcRelationshipSelectorSet *selectorSet,
        OPC_CANONICALIZATION_METHOD transformMethod,
        IOpcSignatureRelationshipReference **relationshipReference);

    HRESULT (STDMETHODCALLTYPE *CreateRelationshipSelectorSet)(
        IOpcSignatureRelationshipReferenceSet* This,
        IOpcRelationshipSelectorSet **selectorSet);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IOpcSignatureRelationshipReferenceSet* This,
        IOpcSignatureRelationshipReference *relationshipReference);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IOpcSignatureRelationshipReferenceSet* This,
        IOpcSignatureRelationshipReferenceEnumerator **relationshipReferenceEnumerator);

    END_INTERFACE
} IOpcSignatureRelationshipReferenceSetVtbl;
interface IOpcSignatureRelationshipReferenceSet {
    CONST_VTBL IOpcSignatureRelationshipReferenceSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureRelationshipReferenceSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureRelationshipReferenceSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureRelationshipReferenceSet_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureRelationshipReferenceSet methods ***/
#define IOpcSignatureRelationshipReferenceSet_Create(This,sourceUri,digestMethod,relationshipSigningOption,selectorSet,transformMethod,relationshipReference) (This)->lpVtbl->Create(This,sourceUri,digestMethod,relationshipSigningOption,selectorSet,transformMethod,relationshipReference)
#define IOpcSignatureRelationshipReferenceSet_CreateRelationshipSelectorSet(This,selectorSet) (This)->lpVtbl->CreateRelationshipSelectorSet(This,selectorSet)
#define IOpcSignatureRelationshipReferenceSet_Delete(This,relationshipReference) (This)->lpVtbl->Delete(This,relationshipReference)
#define IOpcSignatureRelationshipReferenceSet_GetEnumerator(This,relationshipReferenceEnumerator) (This)->lpVtbl->GetEnumerator(This,relationshipReferenceEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceSet_QueryInterface(IOpcSignatureRelationshipReferenceSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureRelationshipReferenceSet_AddRef(IOpcSignatureRelationshipReferenceSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureRelationshipReferenceSet_Release(IOpcSignatureRelationshipReferenceSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureRelationshipReferenceSet methods ***/
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceSet_Create(IOpcSignatureRelationshipReferenceSet* This,IOpcUri *sourceUri,LPCWSTR digestMethod,OPC_RELATIONSHIPS_SIGNING_OPTION relationshipSigningOption,IOpcRelationshipSelectorSet *selectorSet,OPC_CANONICALIZATION_METHOD transformMethod,IOpcSignatureRelationshipReference **relationshipReference) {
    return This->lpVtbl->Create(This,sourceUri,digestMethod,relationshipSigningOption,selectorSet,transformMethod,relationshipReference);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceSet_CreateRelationshipSelectorSet(IOpcSignatureRelationshipReferenceSet* This,IOpcRelationshipSelectorSet **selectorSet) {
    return This->lpVtbl->CreateRelationshipSelectorSet(This,selectorSet);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceSet_Delete(IOpcSignatureRelationshipReferenceSet* This,IOpcSignatureRelationshipReference *relationshipReference) {
    return This->lpVtbl->Delete(This,relationshipReference);
}
static FORCEINLINE HRESULT IOpcSignatureRelationshipReferenceSet_GetEnumerator(IOpcSignatureRelationshipReferenceSet* This,IOpcSignatureRelationshipReferenceEnumerator **relationshipReferenceEnumerator) {
    return This->lpVtbl->GetEnumerator(This,relationshipReferenceEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReferenceSet_Create_Proxy(
    IOpcSignatureRelationshipReferenceSet* This,
    IOpcUri *sourceUri,
    LPCWSTR digestMethod,
    OPC_RELATIONSHIPS_SIGNING_OPTION relationshipSigningOption,
    IOpcRelationshipSelectorSet *selectorSet,
    OPC_CANONICALIZATION_METHOD transformMethod,
    IOpcSignatureRelationshipReference **relationshipReference);
void __RPC_STUB IOpcSignatureRelationshipReferenceSet_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReferenceSet_CreateRelationshipSelectorSet_Proxy(
    IOpcSignatureRelationshipReferenceSet* This,
    IOpcRelationshipSelectorSet **selectorSet);
void __RPC_STUB IOpcSignatureRelationshipReferenceSet_CreateRelationshipSelectorSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReferenceSet_Delete_Proxy(
    IOpcSignatureRelationshipReferenceSet* This,
    IOpcSignatureRelationshipReference *relationshipReference);
void __RPC_STUB IOpcSignatureRelationshipReferenceSet_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureRelationshipReferenceSet_GetEnumerator_Proxy(
    IOpcSignatureRelationshipReferenceSet* This,
    IOpcSignatureRelationshipReferenceEnumerator **relationshipReferenceEnumerator);
void __RPC_STUB IOpcSignatureRelationshipReferenceSet_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureRelationshipReferenceSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureReferenceSet interface
 */
#ifndef __IOpcSignatureReferenceSet_INTERFACE_DEFINED__
#define __IOpcSignatureReferenceSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureReferenceSet, 0xf3b02d31, 0xab12, 0x42dd, 0x9e,0x2f, 0x2b,0x16,0x76,0x1c,0x3c,0x1e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f3b02d31-ab12-42dd-9e2f-2b16761c3c1e")
IOpcSignatureReferenceSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Create(
        IUri *referenceUri,
        LPCWSTR referenceId,
        LPCWSTR type,
        LPCWSTR digestMethod,
        OPC_CANONICALIZATION_METHOD transformMethod,
        IOpcSignatureReference **reference) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        IOpcSignatureReference *reference) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnumerator(
        IOpcSignatureReferenceEnumerator **referenceEnumerator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureReferenceSet, 0xf3b02d31, 0xab12, 0x42dd, 0x9e,0x2f, 0x2b,0x16,0x76,0x1c,0x3c,0x1e)
#endif
#else
typedef struct IOpcSignatureReferenceSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureReferenceSet methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        IOpcSignatureReferenceSet* This,
        IUri *referenceUri,
        LPCWSTR referenceId,
        LPCWSTR type,
        LPCWSTR digestMethod,
        OPC_CANONICALIZATION_METHOD transformMethod,
        IOpcSignatureReference **reference);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IOpcSignatureReferenceSet* This,
        IOpcSignatureReference *reference);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IOpcSignatureReferenceSet* This,
        IOpcSignatureReferenceEnumerator **referenceEnumerator);

    END_INTERFACE
} IOpcSignatureReferenceSetVtbl;
interface IOpcSignatureReferenceSet {
    CONST_VTBL IOpcSignatureReferenceSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureReferenceSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureReferenceSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureReferenceSet_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureReferenceSet methods ***/
#define IOpcSignatureReferenceSet_Create(This,referenceUri,referenceId,type,digestMethod,transformMethod,reference) (This)->lpVtbl->Create(This,referenceUri,referenceId,type,digestMethod,transformMethod,reference)
#define IOpcSignatureReferenceSet_Delete(This,reference) (This)->lpVtbl->Delete(This,reference)
#define IOpcSignatureReferenceSet_GetEnumerator(This,referenceEnumerator) (This)->lpVtbl->GetEnumerator(This,referenceEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureReferenceSet_QueryInterface(IOpcSignatureReferenceSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureReferenceSet_AddRef(IOpcSignatureReferenceSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureReferenceSet_Release(IOpcSignatureReferenceSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureReferenceSet methods ***/
static FORCEINLINE HRESULT IOpcSignatureReferenceSet_Create(IOpcSignatureReferenceSet* This,IUri *referenceUri,LPCWSTR referenceId,LPCWSTR type,LPCWSTR digestMethod,OPC_CANONICALIZATION_METHOD transformMethod,IOpcSignatureReference **reference) {
    return This->lpVtbl->Create(This,referenceUri,referenceId,type,digestMethod,transformMethod,reference);
}
static FORCEINLINE HRESULT IOpcSignatureReferenceSet_Delete(IOpcSignatureReferenceSet* This,IOpcSignatureReference *reference) {
    return This->lpVtbl->Delete(This,reference);
}
static FORCEINLINE HRESULT IOpcSignatureReferenceSet_GetEnumerator(IOpcSignatureReferenceSet* This,IOpcSignatureReferenceEnumerator **referenceEnumerator) {
    return This->lpVtbl->GetEnumerator(This,referenceEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureReferenceSet_Create_Proxy(
    IOpcSignatureReferenceSet* This,
    IUri *referenceUri,
    LPCWSTR referenceId,
    LPCWSTR type,
    LPCWSTR digestMethod,
    OPC_CANONICALIZATION_METHOD transformMethod,
    IOpcSignatureReference **reference);
void __RPC_STUB IOpcSignatureReferenceSet_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReferenceSet_Delete_Proxy(
    IOpcSignatureReferenceSet* This,
    IOpcSignatureReference *reference);
void __RPC_STUB IOpcSignatureReferenceSet_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureReferenceSet_GetEnumerator_Proxy(
    IOpcSignatureReferenceSet* This,
    IOpcSignatureReferenceEnumerator **referenceEnumerator);
void __RPC_STUB IOpcSignatureReferenceSet_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureReferenceSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSignatureCustomObjectSet interface
 */
#ifndef __IOpcSignatureCustomObjectSet_INTERFACE_DEFINED__
#define __IOpcSignatureCustomObjectSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSignatureCustomObjectSet, 0x8f792ac5, 0x7947, 0x4e11, 0xbc,0x3d, 0x26,0x59,0xff,0x04,0x6a,0xe1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8f792ac5-7947-4e11-bc3d-2659ff046ae1")
IOpcSignatureCustomObjectSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Create(
        const UINT8 *xmlMarkup,
        UINT32 count,
        IOpcSignatureCustomObject **customObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        IOpcSignatureCustomObject *customObject) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSignatureCustomObjectSet, 0x8f792ac5, 0x7947, 0x4e11, 0xbc,0x3d, 0x26,0x59,0xff,0x04,0x6a,0xe1)
#endif
#else
typedef struct IOpcSignatureCustomObjectSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcSignatureCustomObjectSet methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        IOpcSignatureCustomObjectSet* This,
        const UINT8 *xmlMarkup,
        UINT32 count,
        IOpcSignatureCustomObject **customObject);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IOpcSignatureCustomObjectSet* This,
        IOpcSignatureCustomObject *customObject);

    HRESULT (STDMETHODCALLTYPE *GetEnumerator)(
        IOpcSignatureCustomObjectSet* This,
        IOpcSignatureCustomObjectEnumerator **customObjectEnumerator);

    END_INTERFACE
} IOpcSignatureCustomObjectSetVtbl;
interface IOpcSignatureCustomObjectSet {
    CONST_VTBL IOpcSignatureCustomObjectSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSignatureCustomObjectSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSignatureCustomObjectSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSignatureCustomObjectSet_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSignatureCustomObjectSet methods ***/
#define IOpcSignatureCustomObjectSet_Create(This,xmlMarkup,count,customObject) (This)->lpVtbl->Create(This,xmlMarkup,count,customObject)
#define IOpcSignatureCustomObjectSet_Delete(This,customObject) (This)->lpVtbl->Delete(This,customObject)
#define IOpcSignatureCustomObjectSet_GetEnumerator(This,customObjectEnumerator) (This)->lpVtbl->GetEnumerator(This,customObjectEnumerator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSignatureCustomObjectSet_QueryInterface(IOpcSignatureCustomObjectSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSignatureCustomObjectSet_AddRef(IOpcSignatureCustomObjectSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSignatureCustomObjectSet_Release(IOpcSignatureCustomObjectSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSignatureCustomObjectSet methods ***/
static FORCEINLINE HRESULT IOpcSignatureCustomObjectSet_Create(IOpcSignatureCustomObjectSet* This,const UINT8 *xmlMarkup,UINT32 count,IOpcSignatureCustomObject **customObject) {
    return This->lpVtbl->Create(This,xmlMarkup,count,customObject);
}
static FORCEINLINE HRESULT IOpcSignatureCustomObjectSet_Delete(IOpcSignatureCustomObjectSet* This,IOpcSignatureCustomObject *customObject) {
    return This->lpVtbl->Delete(This,customObject);
}
static FORCEINLINE HRESULT IOpcSignatureCustomObjectSet_GetEnumerator(IOpcSignatureCustomObjectSet* This,IOpcSignatureCustomObjectEnumerator **customObjectEnumerator) {
    return This->lpVtbl->GetEnumerator(This,customObjectEnumerator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSignatureCustomObjectSet_Create_Proxy(
    IOpcSignatureCustomObjectSet* This,
    const UINT8 *xmlMarkup,
    UINT32 count,
    IOpcSignatureCustomObject **customObject);
void __RPC_STUB IOpcSignatureCustomObjectSet_Create_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureCustomObjectSet_Delete_Proxy(
    IOpcSignatureCustomObjectSet* This,
    IOpcSignatureCustomObject *customObject);
void __RPC_STUB IOpcSignatureCustomObjectSet_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSignatureCustomObjectSet_GetEnumerator_Proxy(
    IOpcSignatureCustomObjectSet* This,
    IOpcSignatureCustomObjectEnumerator **customObjectEnumerator);
void __RPC_STUB IOpcSignatureCustomObjectSet_GetEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSignatureCustomObjectSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcDigitalSignature interface
 */
#ifndef __IOpcDigitalSignature_INTERFACE_DEFINED__
#define __IOpcDigitalSignature_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcDigitalSignature, 0x52ab21dd, 0x1cd0, 0x4949, 0xbc,0x80, 0x0c,0x12,0x32,0xd0,0x0c,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("52ab21dd-1cd0-4949-bc80-0c1232d00cb4")
IOpcDigitalSignature : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNamespaces(
        LPWSTR **prefixes,
        LPWSTR **namespaces,
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureId(
        LPWSTR *signatureId) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE GetCanonicalizationMethod(
        OPC_CANONICALIZATION_METHOD *canonicalizationMethod) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetSignaturePartReferenceEnumerator(
        IOpcSignaturePartReferenceEnumerator **partReferenceEnumerator) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureRelationshipReferenceEnumerator(
        IOpcSignatureRelationshipReferenceEnumerator **relationshipReferenceEnumerator) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE GetPackageObjectReference(
        IOpcSignatureReference **packageObjectReference) = 0;

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

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

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

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcDigitalSignature, 0x52ab21dd, 0x1cd0, 0x4949, 0xbc,0x80, 0x0c,0x12,0x32,0xd0,0x0c,0xb4)
#endif
#else
typedef struct IOpcDigitalSignatureVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcDigitalSignature methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNamespaces)(
        IOpcDigitalSignature* This,
        LPWSTR **prefixes,
        LPWSTR **namespaces,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetSignatureId)(
        IOpcDigitalSignature* This,
        LPWSTR *signatureId);

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

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

    HRESULT (STDMETHODCALLTYPE *GetCanonicalizationMethod)(
        IOpcDigitalSignature* This,
        OPC_CANONICALIZATION_METHOD *canonicalizationMethod);

    HRESULT (STDMETHODCALLTYPE *GetSignatureValue)(
        IOpcDigitalSignature* This,
        UINT8 **signatureValue,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetSignaturePartReferenceEnumerator)(
        IOpcDigitalSignature* This,
        IOpcSignaturePartReferenceEnumerator **partReferenceEnumerator);

    HRESULT (STDMETHODCALLTYPE *GetSignatureRelationshipReferenceEnumerator)(
        IOpcDigitalSignature* This,
        IOpcSignatureRelationshipReferenceEnumerator **relationshipReferenceEnumerator);

    HRESULT (STDMETHODCALLTYPE *GetSigningTime)(
        IOpcDigitalSignature* This,
        LPWSTR *signingTime);

    HRESULT (STDMETHODCALLTYPE *GetTimeFormat)(
        IOpcDigitalSignature* This,
        OPC_SIGNATURE_TIME_FORMAT *timeFormat);

    HRESULT (STDMETHODCALLTYPE *GetPackageObjectReference)(
        IOpcDigitalSignature* This,
        IOpcSignatureReference **packageObjectReference);

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

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

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

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

    END_INTERFACE
} IOpcDigitalSignatureVtbl;
interface IOpcDigitalSignature {
    CONST_VTBL IOpcDigitalSignatureVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcDigitalSignature_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcDigitalSignature_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcDigitalSignature_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcDigitalSignature methods ***/
#define IOpcDigitalSignature_GetNamespaces(This,prefixes,namespaces,count) (This)->lpVtbl->GetNamespaces(This,prefixes,namespaces,count)
#define IOpcDigitalSignature_GetSignatureId(This,signatureId) (This)->lpVtbl->GetSignatureId(This,signatureId)
#define IOpcDigitalSignature_GetSignaturePartName(This,signaturePartName) (This)->lpVtbl->GetSignaturePartName(This,signaturePartName)
#define IOpcDigitalSignature_GetSignatureMethod(This,signatureMethod) (This)->lpVtbl->GetSignatureMethod(This,signatureMethod)
#define IOpcDigitalSignature_GetCanonicalizationMethod(This,canonicalizationMethod) (This)->lpVtbl->GetCanonicalizationMethod(This,canonicalizationMethod)
#define IOpcDigitalSignature_GetSignatureValue(This,signatureValue,count) (This)->lpVtbl->GetSignatureValue(This,signatureValue,count)
#define IOpcDigitalSignature_GetSignaturePartReferenceEnumerator(This,partReferenceEnumerator) (This)->lpVtbl->GetSignaturePartReferenceEnumerator(This,partReferenceEnumerator)
#define IOpcDigitalSignature_GetSignatureRelationshipReferenceEnumerator(This,relationshipReferenceEnumerator) (This)->lpVtbl->GetSignatureRelationshipReferenceEnumerator(This,relationshipReferenceEnumerator)
#define IOpcDigitalSignature_GetSigningTime(This,signingTime) (This)->lpVtbl->GetSigningTime(This,signingTime)
#define IOpcDigitalSignature_GetTimeFormat(This,timeFormat) (This)->lpVtbl->GetTimeFormat(This,timeFormat)
#define IOpcDigitalSignature_GetPackageObjectReference(This,packageObjectReference) (This)->lpVtbl->GetPackageObjectReference(This,packageObjectReference)
#define IOpcDigitalSignature_GetCertificateEnumerator(This,certificateEnumerator) (This)->lpVtbl->GetCertificateEnumerator(This,certificateEnumerator)
#define IOpcDigitalSignature_GetCustomReferenceEnumerator(This,customReferenceEnumerator) (This)->lpVtbl->GetCustomReferenceEnumerator(This,customReferenceEnumerator)
#define IOpcDigitalSignature_GetCustomObjectEnumerator(This,customObjectEnumerator) (This)->lpVtbl->GetCustomObjectEnumerator(This,customObjectEnumerator)
#define IOpcDigitalSignature_GetSignatureXml(This,signatureXml,count) (This)->lpVtbl->GetSignatureXml(This,signatureXml,count)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcDigitalSignature_QueryInterface(IOpcDigitalSignature* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcDigitalSignature_AddRef(IOpcDigitalSignature* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcDigitalSignature_Release(IOpcDigitalSignature* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcDigitalSignature methods ***/
static FORCEINLINE HRESULT IOpcDigitalSignature_GetNamespaces(IOpcDigitalSignature* This,LPWSTR **prefixes,LPWSTR **namespaces,UINT32 *count) {
    return This->lpVtbl->GetNamespaces(This,prefixes,namespaces,count);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetSignatureId(IOpcDigitalSignature* This,LPWSTR *signatureId) {
    return This->lpVtbl->GetSignatureId(This,signatureId);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetSignaturePartName(IOpcDigitalSignature* This,IOpcPartUri **signaturePartName) {
    return This->lpVtbl->GetSignaturePartName(This,signaturePartName);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetSignatureMethod(IOpcDigitalSignature* This,LPWSTR *signatureMethod) {
    return This->lpVtbl->GetSignatureMethod(This,signatureMethod);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetCanonicalizationMethod(IOpcDigitalSignature* This,OPC_CANONICALIZATION_METHOD *canonicalizationMethod) {
    return This->lpVtbl->GetCanonicalizationMethod(This,canonicalizationMethod);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetSignatureValue(IOpcDigitalSignature* This,UINT8 **signatureValue,UINT32 *count) {
    return This->lpVtbl->GetSignatureValue(This,signatureValue,count);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetSignaturePartReferenceEnumerator(IOpcDigitalSignature* This,IOpcSignaturePartReferenceEnumerator **partReferenceEnumerator) {
    return This->lpVtbl->GetSignaturePartReferenceEnumerator(This,partReferenceEnumerator);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetSignatureRelationshipReferenceEnumerator(IOpcDigitalSignature* This,IOpcSignatureRelationshipReferenceEnumerator **relationshipReferenceEnumerator) {
    return This->lpVtbl->GetSignatureRelationshipReferenceEnumerator(This,relationshipReferenceEnumerator);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetSigningTime(IOpcDigitalSignature* This,LPWSTR *signingTime) {
    return This->lpVtbl->GetSigningTime(This,signingTime);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetTimeFormat(IOpcDigitalSignature* This,OPC_SIGNATURE_TIME_FORMAT *timeFormat) {
    return This->lpVtbl->GetTimeFormat(This,timeFormat);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetPackageObjectReference(IOpcDigitalSignature* This,IOpcSignatureReference **packageObjectReference) {
    return This->lpVtbl->GetPackageObjectReference(This,packageObjectReference);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetCertificateEnumerator(IOpcDigitalSignature* This,IOpcCertificateEnumerator **certificateEnumerator) {
    return This->lpVtbl->GetCertificateEnumerator(This,certificateEnumerator);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetCustomReferenceEnumerator(IOpcDigitalSignature* This,IOpcSignatureReferenceEnumerator **customReferenceEnumerator) {
    return This->lpVtbl->GetCustomReferenceEnumerator(This,customReferenceEnumerator);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetCustomObjectEnumerator(IOpcDigitalSignature* This,IOpcSignatureCustomObjectEnumerator **customObjectEnumerator) {
    return This->lpVtbl->GetCustomObjectEnumerator(This,customObjectEnumerator);
}
static FORCEINLINE HRESULT IOpcDigitalSignature_GetSignatureXml(IOpcDigitalSignature* This,UINT8 **signatureXml,UINT32 *count) {
    return This->lpVtbl->GetSignatureXml(This,signatureXml,count);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetNamespaces_Proxy(
    IOpcDigitalSignature* This,
    LPWSTR **prefixes,
    LPWSTR **namespaces,
    UINT32 *count);
void __RPC_STUB IOpcDigitalSignature_GetNamespaces_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetSignatureId_Proxy(
    IOpcDigitalSignature* This,
    LPWSTR *signatureId);
void __RPC_STUB IOpcDigitalSignature_GetSignatureId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetSignaturePartName_Proxy(
    IOpcDigitalSignature* This,
    IOpcPartUri **signaturePartName);
void __RPC_STUB IOpcDigitalSignature_GetSignaturePartName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetSignatureMethod_Proxy(
    IOpcDigitalSignature* This,
    LPWSTR *signatureMethod);
void __RPC_STUB IOpcDigitalSignature_GetSignatureMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetCanonicalizationMethod_Proxy(
    IOpcDigitalSignature* This,
    OPC_CANONICALIZATION_METHOD *canonicalizationMethod);
void __RPC_STUB IOpcDigitalSignature_GetCanonicalizationMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetSignatureValue_Proxy(
    IOpcDigitalSignature* This,
    UINT8 **signatureValue,
    UINT32 *count);
void __RPC_STUB IOpcDigitalSignature_GetSignatureValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetSignaturePartReferenceEnumerator_Proxy(
    IOpcDigitalSignature* This,
    IOpcSignaturePartReferenceEnumerator **partReferenceEnumerator);
void __RPC_STUB IOpcDigitalSignature_GetSignaturePartReferenceEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetSignatureRelationshipReferenceEnumerator_Proxy(
    IOpcDigitalSignature* This,
    IOpcSignatureRelationshipReferenceEnumerator **relationshipReferenceEnumerator);
void __RPC_STUB IOpcDigitalSignature_GetSignatureRelationshipReferenceEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetSigningTime_Proxy(
    IOpcDigitalSignature* This,
    LPWSTR *signingTime);
void __RPC_STUB IOpcDigitalSignature_GetSigningTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetTimeFormat_Proxy(
    IOpcDigitalSignature* This,
    OPC_SIGNATURE_TIME_FORMAT *timeFormat);
void __RPC_STUB IOpcDigitalSignature_GetTimeFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetPackageObjectReference_Proxy(
    IOpcDigitalSignature* This,
    IOpcSignatureReference **packageObjectReference);
void __RPC_STUB IOpcDigitalSignature_GetPackageObjectReference_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetCertificateEnumerator_Proxy(
    IOpcDigitalSignature* This,
    IOpcCertificateEnumerator **certificateEnumerator);
void __RPC_STUB IOpcDigitalSignature_GetCertificateEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetCustomReferenceEnumerator_Proxy(
    IOpcDigitalSignature* This,
    IOpcSignatureReferenceEnumerator **customReferenceEnumerator);
void __RPC_STUB IOpcDigitalSignature_GetCustomReferenceEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetCustomObjectEnumerator_Proxy(
    IOpcDigitalSignature* This,
    IOpcSignatureCustomObjectEnumerator **customObjectEnumerator);
void __RPC_STUB IOpcDigitalSignature_GetCustomObjectEnumerator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcDigitalSignature_GetSignatureXml_Proxy(
    IOpcDigitalSignature* This,
    UINT8 **signatureXml,
    UINT32 *count);
void __RPC_STUB IOpcDigitalSignature_GetSignatureXml_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcDigitalSignature_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcSigningOptions interface
 */
#ifndef __IOpcSigningOptions_INTERFACE_DEFINED__
#define __IOpcSigningOptions_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcSigningOptions, 0x50d2d6a5, 0x7aeb, 0x46c0, 0xb2,0x41, 0x43,0xab,0x0e,0x9b,0x40,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50d2d6a5-7aeb-46c0-b241-43ab0e9b407e")
IOpcSigningOptions : 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 GetDefaultDigestMethod(
        LPWSTR *digestMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultDigestMethod(
        LPCWSTR digestMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCertificateEmbeddingOption(
        OPC_CERTIFICATE_EMBEDDING_OPTION *embeddingOption) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCertificateEmbeddingOption(
        OPC_CERTIFICATE_EMBEDDING_OPTION embeddingOption) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE SetTimeFormat(
        OPC_SIGNATURE_TIME_FORMAT timeFormat) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignaturePartReferenceSet(
        IOpcSignaturePartReferenceSet **partReferenceSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureRelationshipReferenceSet(
        IOpcSignatureRelationshipReferenceSet **relationshipReferenceSet) = 0;

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

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

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

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

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcSigningOptions, 0x50d2d6a5, 0x7aeb, 0x46c0, 0xb2,0x41, 0x43,0xab,0x0e,0x9b,0x40,0x7e)
#endif
#else
typedef struct IOpcSigningOptionsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *GetDefaultDigestMethod)(
        IOpcSigningOptions* This,
        LPWSTR *digestMethod);

    HRESULT (STDMETHODCALLTYPE *SetDefaultDigestMethod)(
        IOpcSigningOptions* This,
        LPCWSTR digestMethod);

    HRESULT (STDMETHODCALLTYPE *GetCertificateEmbeddingOption)(
        IOpcSigningOptions* This,
        OPC_CERTIFICATE_EMBEDDING_OPTION *embeddingOption);

    HRESULT (STDMETHODCALLTYPE *SetCertificateEmbeddingOption)(
        IOpcSigningOptions* This,
        OPC_CERTIFICATE_EMBEDDING_OPTION embeddingOption);

    HRESULT (STDMETHODCALLTYPE *GetTimeFormat)(
        IOpcSigningOptions* This,
        OPC_SIGNATURE_TIME_FORMAT *timeFormat);

    HRESULT (STDMETHODCALLTYPE *SetTimeFormat)(
        IOpcSigningOptions* This,
        OPC_SIGNATURE_TIME_FORMAT timeFormat);

    HRESULT (STDMETHODCALLTYPE *GetSignaturePartReferenceSet)(
        IOpcSigningOptions* This,
        IOpcSignaturePartReferenceSet **partReferenceSet);

    HRESULT (STDMETHODCALLTYPE *GetSignatureRelationshipReferenceSet)(
        IOpcSigningOptions* This,
        IOpcSignatureRelationshipReferenceSet **relationshipReferenceSet);

    HRESULT (STDMETHODCALLTYPE *GetCustomObjectSet)(
        IOpcSigningOptions* This,
        IOpcSignatureCustomObjectSet **customObjectSet);

    HRESULT (STDMETHODCALLTYPE *GetCustomReferenceSet)(
        IOpcSigningOptions* This,
        IOpcSignatureReferenceSet **customReferenceSet);

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

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

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

    END_INTERFACE
} IOpcSigningOptionsVtbl;
interface IOpcSigningOptions {
    CONST_VTBL IOpcSigningOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcSigningOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcSigningOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcSigningOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcSigningOptions methods ***/
#define IOpcSigningOptions_GetSignatureId(This,signatureId) (This)->lpVtbl->GetSignatureId(This,signatureId)
#define IOpcSigningOptions_SetSignatureId(This,signatureId) (This)->lpVtbl->SetSignatureId(This,signatureId)
#define IOpcSigningOptions_GetSignatureMethod(This,signatureMethod) (This)->lpVtbl->GetSignatureMethod(This,signatureMethod)
#define IOpcSigningOptions_SetSignatureMethod(This,signatureMethod) (This)->lpVtbl->SetSignatureMethod(This,signatureMethod)
#define IOpcSigningOptions_GetDefaultDigestMethod(This,digestMethod) (This)->lpVtbl->GetDefaultDigestMethod(This,digestMethod)
#define IOpcSigningOptions_SetDefaultDigestMethod(This,digestMethod) (This)->lpVtbl->SetDefaultDigestMethod(This,digestMethod)
#define IOpcSigningOptions_GetCertificateEmbeddingOption(This,embeddingOption) (This)->lpVtbl->GetCertificateEmbeddingOption(This,embeddingOption)
#define IOpcSigningOptions_SetCertificateEmbeddingOption(This,embeddingOption) (This)->lpVtbl->SetCertificateEmbeddingOption(This,embeddingOption)
#define IOpcSigningOptions_GetTimeFormat(This,timeFormat) (This)->lpVtbl->GetTimeFormat(This,timeFormat)
#define IOpcSigningOptions_SetTimeFormat(This,timeFormat) (This)->lpVtbl->SetTimeFormat(This,timeFormat)
#define IOpcSigningOptions_GetSignaturePartReferenceSet(This,partReferenceSet) (This)->lpVtbl->GetSignaturePartReferenceSet(This,partReferenceSet)
#define IOpcSigningOptions_GetSignatureRelationshipReferenceSet(This,relationshipReferenceSet) (This)->lpVtbl->GetSignatureRelationshipReferenceSet(This,relationshipReferenceSet)
#define IOpcSigningOptions_GetCustomObjectSet(This,customObjectSet) (This)->lpVtbl->GetCustomObjectSet(This,customObjectSet)
#define IOpcSigningOptions_GetCustomReferenceSet(This,customReferenceSet) (This)->lpVtbl->GetCustomReferenceSet(This,customReferenceSet)
#define IOpcSigningOptions_GetCertificateSet(This,certificateSet) (This)->lpVtbl->GetCertificateSet(This,certificateSet)
#define IOpcSigningOptions_GetSignaturePartName(This,signaturePartName) (This)->lpVtbl->GetSignaturePartName(This,signaturePartName)
#define IOpcSigningOptions_SetSignaturePartName(This,signaturePartName) (This)->lpVtbl->SetSignaturePartName(This,signaturePartName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcSigningOptions_QueryInterface(IOpcSigningOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcSigningOptions_AddRef(IOpcSigningOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcSigningOptions_Release(IOpcSigningOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcSigningOptions methods ***/
static FORCEINLINE HRESULT IOpcSigningOptions_GetSignatureId(IOpcSigningOptions* This,LPWSTR *signatureId) {
    return This->lpVtbl->GetSignatureId(This,signatureId);
}
static FORCEINLINE HRESULT IOpcSigningOptions_SetSignatureId(IOpcSigningOptions* This,LPCWSTR signatureId) {
    return This->lpVtbl->SetSignatureId(This,signatureId);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetSignatureMethod(IOpcSigningOptions* This,LPWSTR *signatureMethod) {
    return This->lpVtbl->GetSignatureMethod(This,signatureMethod);
}
static FORCEINLINE HRESULT IOpcSigningOptions_SetSignatureMethod(IOpcSigningOptions* This,LPCWSTR signatureMethod) {
    return This->lpVtbl->SetSignatureMethod(This,signatureMethod);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetDefaultDigestMethod(IOpcSigningOptions* This,LPWSTR *digestMethod) {
    return This->lpVtbl->GetDefaultDigestMethod(This,digestMethod);
}
static FORCEINLINE HRESULT IOpcSigningOptions_SetDefaultDigestMethod(IOpcSigningOptions* This,LPCWSTR digestMethod) {
    return This->lpVtbl->SetDefaultDigestMethod(This,digestMethod);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetCertificateEmbeddingOption(IOpcSigningOptions* This,OPC_CERTIFICATE_EMBEDDING_OPTION *embeddingOption) {
    return This->lpVtbl->GetCertificateEmbeddingOption(This,embeddingOption);
}
static FORCEINLINE HRESULT IOpcSigningOptions_SetCertificateEmbeddingOption(IOpcSigningOptions* This,OPC_CERTIFICATE_EMBEDDING_OPTION embeddingOption) {
    return This->lpVtbl->SetCertificateEmbeddingOption(This,embeddingOption);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetTimeFormat(IOpcSigningOptions* This,OPC_SIGNATURE_TIME_FORMAT *timeFormat) {
    return This->lpVtbl->GetTimeFormat(This,timeFormat);
}
static FORCEINLINE HRESULT IOpcSigningOptions_SetTimeFormat(IOpcSigningOptions* This,OPC_SIGNATURE_TIME_FORMAT timeFormat) {
    return This->lpVtbl->SetTimeFormat(This,timeFormat);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetSignaturePartReferenceSet(IOpcSigningOptions* This,IOpcSignaturePartReferenceSet **partReferenceSet) {
    return This->lpVtbl->GetSignaturePartReferenceSet(This,partReferenceSet);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetSignatureRelationshipReferenceSet(IOpcSigningOptions* This,IOpcSignatureRelationshipReferenceSet **relationshipReferenceSet) {
    return This->lpVtbl->GetSignatureRelationshipReferenceSet(This,relationshipReferenceSet);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetCustomObjectSet(IOpcSigningOptions* This,IOpcSignatureCustomObjectSet **customObjectSet) {
    return This->lpVtbl->GetCustomObjectSet(This,customObjectSet);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetCustomReferenceSet(IOpcSigningOptions* This,IOpcSignatureReferenceSet **customReferenceSet) {
    return This->lpVtbl->GetCustomReferenceSet(This,customReferenceSet);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetCertificateSet(IOpcSigningOptions* This,IOpcCertificateSet **certificateSet) {
    return This->lpVtbl->GetCertificateSet(This,certificateSet);
}
static FORCEINLINE HRESULT IOpcSigningOptions_GetSignaturePartName(IOpcSigningOptions* This,IOpcPartUri **signaturePartName) {
    return This->lpVtbl->GetSignaturePartName(This,signaturePartName);
}
static FORCEINLINE HRESULT IOpcSigningOptions_SetSignaturePartName(IOpcSigningOptions* This,IOpcPartUri *signaturePartName) {
    return This->lpVtbl->SetSignaturePartName(This,signaturePartName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetSignatureId_Proxy(
    IOpcSigningOptions* This,
    LPWSTR *signatureId);
void __RPC_STUB IOpcSigningOptions_GetSignatureId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_SetSignatureId_Proxy(
    IOpcSigningOptions* This,
    LPCWSTR signatureId);
void __RPC_STUB IOpcSigningOptions_SetSignatureId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetSignatureMethod_Proxy(
    IOpcSigningOptions* This,
    LPWSTR *signatureMethod);
void __RPC_STUB IOpcSigningOptions_GetSignatureMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_SetSignatureMethod_Proxy(
    IOpcSigningOptions* This,
    LPCWSTR signatureMethod);
void __RPC_STUB IOpcSigningOptions_SetSignatureMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetDefaultDigestMethod_Proxy(
    IOpcSigningOptions* This,
    LPWSTR *digestMethod);
void __RPC_STUB IOpcSigningOptions_GetDefaultDigestMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_SetDefaultDigestMethod_Proxy(
    IOpcSigningOptions* This,
    LPCWSTR digestMethod);
void __RPC_STUB IOpcSigningOptions_SetDefaultDigestMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetCertificateEmbeddingOption_Proxy(
    IOpcSigningOptions* This,
    OPC_CERTIFICATE_EMBEDDING_OPTION *embeddingOption);
void __RPC_STUB IOpcSigningOptions_GetCertificateEmbeddingOption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_SetCertificateEmbeddingOption_Proxy(
    IOpcSigningOptions* This,
    OPC_CERTIFICATE_EMBEDDING_OPTION embeddingOption);
void __RPC_STUB IOpcSigningOptions_SetCertificateEmbeddingOption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetTimeFormat_Proxy(
    IOpcSigningOptions* This,
    OPC_SIGNATURE_TIME_FORMAT *timeFormat);
void __RPC_STUB IOpcSigningOptions_GetTimeFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_SetTimeFormat_Proxy(
    IOpcSigningOptions* This,
    OPC_SIGNATURE_TIME_FORMAT timeFormat);
void __RPC_STUB IOpcSigningOptions_SetTimeFormat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetSignaturePartReferenceSet_Proxy(
    IOpcSigningOptions* This,
    IOpcSignaturePartReferenceSet **partReferenceSet);
void __RPC_STUB IOpcSigningOptions_GetSignaturePartReferenceSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetSignatureRelationshipReferenceSet_Proxy(
    IOpcSigningOptions* This,
    IOpcSignatureRelationshipReferenceSet **relationshipReferenceSet);
void __RPC_STUB IOpcSigningOptions_GetSignatureRelationshipReferenceSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetCustomObjectSet_Proxy(
    IOpcSigningOptions* This,
    IOpcSignatureCustomObjectSet **customObjectSet);
void __RPC_STUB IOpcSigningOptions_GetCustomObjectSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetCustomReferenceSet_Proxy(
    IOpcSigningOptions* This,
    IOpcSignatureReferenceSet **customReferenceSet);
void __RPC_STUB IOpcSigningOptions_GetCustomReferenceSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetCertificateSet_Proxy(
    IOpcSigningOptions* This,
    IOpcCertificateSet **certificateSet);
void __RPC_STUB IOpcSigningOptions_GetCertificateSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_GetSignaturePartName_Proxy(
    IOpcSigningOptions* This,
    IOpcPartUri **signaturePartName);
void __RPC_STUB IOpcSigningOptions_GetSignaturePartName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcSigningOptions_SetSignaturePartName_Proxy(
    IOpcSigningOptions* This,
    IOpcPartUri *signaturePartName);
void __RPC_STUB IOpcSigningOptions_SetSignaturePartName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcSigningOptions_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOpcFactory interface
 */
#ifndef __IOpcFactory_INTERFACE_DEFINED__
#define __IOpcFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOpcFactory, 0x6d0b4446, 0xcd73, 0x4ab3, 0x94,0xf4, 0x8c,0xcd,0xf6,0x11,0x61,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6d0b4446-cd73-4ab3-94f4-8ccdf6116154")
IOpcFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreatePackageRootUri(
        IOpcUri **rootUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePartUri(
        LPCWSTR pwzUri,
        IOpcPartUri **partUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStreamOnFile(
        LPCWSTR filename,
        OPC_STREAM_IO_MODE ioMode,
        LPSECURITY_ATTRIBUTES securityAttributes,
        DWORD dwFlagsAndAttributes,
        IStream **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePackage(
        IOpcPackage **package) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReadPackageFromStream(
        IStream *stream,
        OPC_READ_FLAGS flags,
        IOpcPackage **package) = 0;

    virtual HRESULT STDMETHODCALLTYPE WritePackageToStream(
        IOpcPackage *package,
        OPC_WRITE_FLAGS flags,
        IStream *stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDigitalSignatureManager(
        IOpcPackage *package,
        IOpcDigitalSignatureManager **signatureManager) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOpcFactory, 0x6d0b4446, 0xcd73, 0x4ab3, 0x94,0xf4, 0x8c,0xcd,0xf6,0x11,0x61,0x54)
#endif
#else
typedef struct IOpcFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOpcFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePackageRootUri)(
        IOpcFactory* This,
        IOpcUri **rootUri);

    HRESULT (STDMETHODCALLTYPE *CreatePartUri)(
        IOpcFactory* This,
        LPCWSTR pwzUri,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *CreateStreamOnFile)(
        IOpcFactory* This,
        LPCWSTR filename,
        OPC_STREAM_IO_MODE ioMode,
        LPSECURITY_ATTRIBUTES securityAttributes,
        DWORD dwFlagsAndAttributes,
        IStream **stream);

    HRESULT (STDMETHODCALLTYPE *CreatePackage)(
        IOpcFactory* This,
        IOpcPackage **package);

    HRESULT (STDMETHODCALLTYPE *ReadPackageFromStream)(
        IOpcFactory* This,
        IStream *stream,
        OPC_READ_FLAGS flags,
        IOpcPackage **package);

    HRESULT (STDMETHODCALLTYPE *WritePackageToStream)(
        IOpcFactory* This,
        IOpcPackage *package,
        OPC_WRITE_FLAGS flags,
        IStream *stream);

    HRESULT (STDMETHODCALLTYPE *CreateDigitalSignatureManager)(
        IOpcFactory* This,
        IOpcPackage *package,
        IOpcDigitalSignatureManager **signatureManager);

    END_INTERFACE
} IOpcFactoryVtbl;
interface IOpcFactory {
    CONST_VTBL IOpcFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOpcFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOpcFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOpcFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IOpcFactory methods ***/
#define IOpcFactory_CreatePackageRootUri(This,rootUri) (This)->lpVtbl->CreatePackageRootUri(This,rootUri)
#define IOpcFactory_CreatePartUri(This,pwzUri,partUri) (This)->lpVtbl->CreatePartUri(This,pwzUri,partUri)
#define IOpcFactory_CreateStreamOnFile(This,filename,ioMode,securityAttributes,dwFlagsAndAttributes,stream) (This)->lpVtbl->CreateStreamOnFile(This,filename,ioMode,securityAttributes,dwFlagsAndAttributes,stream)
#define IOpcFactory_CreatePackage(This,package) (This)->lpVtbl->CreatePackage(This,package)
#define IOpcFactory_ReadPackageFromStream(This,stream,flags,package) (This)->lpVtbl->ReadPackageFromStream(This,stream,flags,package)
#define IOpcFactory_WritePackageToStream(This,package,flags,stream) (This)->lpVtbl->WritePackageToStream(This,package,flags,stream)
#define IOpcFactory_CreateDigitalSignatureManager(This,package,signatureManager) (This)->lpVtbl->CreateDigitalSignatureManager(This,package,signatureManager)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IOpcFactory_QueryInterface(IOpcFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOpcFactory_AddRef(IOpcFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOpcFactory_Release(IOpcFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IOpcFactory methods ***/
static FORCEINLINE HRESULT IOpcFactory_CreatePackageRootUri(IOpcFactory* This,IOpcUri **rootUri) {
    return This->lpVtbl->CreatePackageRootUri(This,rootUri);
}
static FORCEINLINE HRESULT IOpcFactory_CreatePartUri(IOpcFactory* This,LPCWSTR pwzUri,IOpcPartUri **partUri) {
    return This->lpVtbl->CreatePartUri(This,pwzUri,partUri);
}
static FORCEINLINE HRESULT IOpcFactory_CreateStreamOnFile(IOpcFactory* This,LPCWSTR filename,OPC_STREAM_IO_MODE ioMode,LPSECURITY_ATTRIBUTES securityAttributes,DWORD dwFlagsAndAttributes,IStream **stream) {
    return This->lpVtbl->CreateStreamOnFile(This,filename,ioMode,securityAttributes,dwFlagsAndAttributes,stream);
}
static FORCEINLINE HRESULT IOpcFactory_CreatePackage(IOpcFactory* This,IOpcPackage **package) {
    return This->lpVtbl->CreatePackage(This,package);
}
static FORCEINLINE HRESULT IOpcFactory_ReadPackageFromStream(IOpcFactory* This,IStream *stream,OPC_READ_FLAGS flags,IOpcPackage **package) {
    return This->lpVtbl->ReadPackageFromStream(This,stream,flags,package);
}
static FORCEINLINE HRESULT IOpcFactory_WritePackageToStream(IOpcFactory* This,IOpcPackage *package,OPC_WRITE_FLAGS flags,IStream *stream) {
    return This->lpVtbl->WritePackageToStream(This,package,flags,stream);
}
static FORCEINLINE HRESULT IOpcFactory_CreateDigitalSignatureManager(IOpcFactory* This,IOpcPackage *package,IOpcDigitalSignatureManager **signatureManager) {
    return This->lpVtbl->CreateDigitalSignatureManager(This,package,signatureManager);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IOpcFactory_CreatePackageRootUri_Proxy(
    IOpcFactory* This,
    IOpcUri **rootUri);
void __RPC_STUB IOpcFactory_CreatePackageRootUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcFactory_CreatePartUri_Proxy(
    IOpcFactory* This,
    LPCWSTR pwzUri,
    IOpcPartUri **partUri);
void __RPC_STUB IOpcFactory_CreatePartUri_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcFactory_CreatePackage_Proxy(
    IOpcFactory* This,
    IOpcPackage **package);
void __RPC_STUB IOpcFactory_CreatePackage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcFactory_ReadPackageFromStream_Proxy(
    IOpcFactory* This,
    IStream *stream,
    OPC_READ_FLAGS flags,
    IOpcPackage **package);
void __RPC_STUB IOpcFactory_ReadPackageFromStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcFactory_WritePackageToStream_Proxy(
    IOpcFactory* This,
    IOpcPackage *package,
    OPC_WRITE_FLAGS flags,
    IStream *stream);
void __RPC_STUB IOpcFactory_WritePackageToStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOpcFactory_CreateDigitalSignatureManager_Proxy(
    IOpcFactory* This,
    IOpcPackage *package,
    IOpcDigitalSignatureManager **signatureManager);
void __RPC_STUB IOpcFactory_CreateDigitalSignatureManager_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOpcFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * OpcFactory coclass
 */

DEFINE_GUID(CLSID_OpcFactory, 0x6b2d6ba0, 0x9f3e, 0x4f27, 0x92,0x0b, 0x31,0x3c,0xc4,0x26,0xa3,0x9e);

#ifdef __cplusplus
class DECLSPEC_UUID("6b2d6ba0-9f3e-4f27-920b-313cc426a39e") OpcFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(OpcFactory, 0x6b2d6ba0, 0x9f3e, 0x4f27, 0x92,0x0b, 0x31,0x3c,0xc4,0x26,0xa3,0x9e)
#endif
#endif

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


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __msopc_h__ */
