/*** Autogenerated by WIDL 1.2-rc3 from optary.idl - Do not edit ***/

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

#ifndef __WIDL_OPTARY_H
#define __WIDL_OPTARY_H

#ifdef __cplusplus
extern "C" {
#endif

/* Headers for imported files */

#include <objidl.h>
#include <oleidl.h>

/* Forward declarations */

#ifndef __IOptionArray_FWD_DEFINED__
#define __IOptionArray_FWD_DEFINED__
typedef interface IOptionArray IOptionArray;
#endif

#ifndef __IHtmlLoadOptions_FWD_DEFINED__
#define __IHtmlLoadOptions_FWD_DEFINED__
typedef interface IHtmlLoadOptions IHtmlLoadOptions;
#endif


/*****************************************************************************
 * IOptionArray interface
 */
#ifndef __IOptionArray_INTERFACE_DEFINED__
#define __IOptionArray_INTERFACE_DEFINED__

typedef IOptionArray *LPOPTIONARRAY;
DEFINE_GUID(IID_IOptionArray, 0x22b6d492, 0x0f88, 0x11d1, 0xba,0x19, 0x00,0xc0,0x4f,0xd9,0x12,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
interface IOptionArray : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryOption(
        DWORD dwOption,
        LPVOID pBuffer,
        ULONG *pcbBuf) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOption(
        DWORD dwOption,
        LPVOID pBuffer,
        ULONG cbBuf) = 0;

};
#else
typedef struct IOptionArrayVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOptionArray methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryOption)(
        IOptionArray* This,
        DWORD dwOption,
        LPVOID pBuffer,
        ULONG *pcbBuf);

    HRESULT (STDMETHODCALLTYPE *SetOption)(
        IOptionArray* This,
        DWORD dwOption,
        LPVOID pBuffer,
        ULONG cbBuf);

    END_INTERFACE
} IOptionArrayVtbl;
interface IOptionArray {
    CONST_VTBL IOptionArrayVtbl* lpVtbl;
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IOptionArray_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOptionArray_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOptionArray_Release(This) (This)->lpVtbl->Release(This)
/*** IOptionArray methods ***/
#define IOptionArray_QueryOption(This,dwOption,pBuffer,pcbBuf) (This)->lpVtbl->QueryOption(This,dwOption,pBuffer,pcbBuf)
#define IOptionArray_SetOption(This,dwOption,pBuffer,cbBuf) (This)->lpVtbl->SetOption(This,dwOption,pBuffer,cbBuf)
#endif

#endif

HRESULT STDMETHODCALLTYPE IOptionArray_QueryOption_Proxy(
    IOptionArray* This,
    DWORD dwOption,
    LPVOID pBuffer,
    ULONG *pcbBuf);
void __RPC_STUB IOptionArray_QueryOption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IOptionArray_SetOption_Proxy(
    IOptionArray* This,
    DWORD dwOption,
    LPVOID pBuffer,
    ULONG cbBuf);
void __RPC_STUB IOptionArray_SetOption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IOptionArray_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IHtmlLoadOptions interface
 */
#ifndef __IHtmlLoadOptions_INTERFACE_DEFINED__
#define __IHtmlLoadOptions_INTERFACE_DEFINED__

typedef enum __WIDL_optary_generated_name_00000000 {
    HTMLLOADOPTION_CODEPAGE = 0,
    HTMLLOADOPTION_INETSHORTCUTPATH = 1,
    HTMLLOADOPTION_HYPERLINK = 2,
    HTMLLOADOPTION_FRAMELOAD = 3
} HTMLLOADOPTION;
DEFINE_GUID(IID_IHtmlLoadOptions, 0xa71a0808, 0x0f88, 0x11d1, 0xba,0x19, 0x00,0xc0,0x4f,0xd9,0x12,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
interface IHtmlLoadOptions : public IOptionArray
{
};
#else
typedef struct IHtmlLoadOptionsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOptionArray methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryOption)(
        IHtmlLoadOptions* This,
        DWORD dwOption,
        LPVOID pBuffer,
        ULONG *pcbBuf);

    HRESULT (STDMETHODCALLTYPE *SetOption)(
        IHtmlLoadOptions* This,
        DWORD dwOption,
        LPVOID pBuffer,
        ULONG cbBuf);

    END_INTERFACE
} IHtmlLoadOptionsVtbl;
interface IHtmlLoadOptions {
    CONST_VTBL IHtmlLoadOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IHtmlLoadOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IHtmlLoadOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IHtmlLoadOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IOptionArray methods ***/
#define IHtmlLoadOptions_QueryOption(This,dwOption,pBuffer,pcbBuf) (This)->lpVtbl->QueryOption(This,dwOption,pBuffer,pcbBuf)
#define IHtmlLoadOptions_SetOption(This,dwOption,pBuffer,cbBuf) (This)->lpVtbl->SetOption(This,dwOption,pBuffer,cbBuf)
#endif

#endif


#endif  /* __IHtmlLoadOptions_INTERFACE_DEFINED__ */

DEFINE_GUID(CLSID_HTMLLoadOptions, 0x18845040, 0x0FA5, 0x11D1, 0xBA,0x19, 0x00,0xC0,0x4F,0xD9,0x12,0xD0);
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __WIDL_OPTARY_H */
