/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 440
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error This stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __htiframe_h__
#define __htiframe_h__

#ifndef __ITargetNotify_FWD_DEFINED__
#define __ITargetNotify_FWD_DEFINED__
typedef struct ITargetNotify ITargetNotify;
#endif

#ifndef __ITargetNotify2_FWD_DEFINED__
#define __ITargetNotify2_FWD_DEFINED__
typedef struct ITargetNotify2 ITargetNotify2;
#endif

#ifndef __ITargetFrame2_FWD_DEFINED__
#define __ITargetFrame2_FWD_DEFINED__
typedef struct ITargetFrame2 ITargetFrame2;
#endif

#ifndef __ITargetContainer_FWD_DEFINED__
#define __ITargetContainer_FWD_DEFINED__
typedef struct ITargetContainer ITargetContainer;
#endif

#include "objidl.h"
#include "oleidl.h"

#ifdef __cplusplus
extern "C"{
#endif

  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);

  EXTERN_C const IID IID_ITargetFrame2;
  EXTERN_C const IID IID_ITargetContainer;
#ifndef _LPTARGETFRAME2_DEFINED
#define _LPTARGETFRAME2_DEFINED
#define TF_NAVIGATE 0x7FAEABAC
#define TARGET_NOTIFY_OBJECT_NAME L"863a99a0-21bc-11d0-82b4-00a0c90c29c5"

  extern RPC_IF_HANDLE __MIDL_itf_htiframe_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_htiframe_0000_v0_0_s_ifspec;

#ifndef __ITargetNotify_INTERFACE_DEFINED__
#define __ITargetNotify_INTERFACE_DEFINED__

  typedef ITargetNotify *LPTARGETNOTIFY;

  EXTERN_C const IID IID_ITargetNotify;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITargetNotify : public IUnknown {
  public:
    virtual HRESULT WINAPI OnCreate(IUnknown *pUnkDestination,ULONG cbCookie) = 0;
    virtual HRESULT WINAPI OnReuse(IUnknown *pUnkDestination) = 0;
  };
#else
  typedef struct ITargetNotifyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITargetNotify *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITargetNotify *This);
      ULONG (WINAPI *Release)(ITargetNotify *This);
      HRESULT (WINAPI *OnCreate)(ITargetNotify *This,IUnknown *pUnkDestination,ULONG cbCookie);
      HRESULT (WINAPI *OnReuse)(ITargetNotify *This,IUnknown *pUnkDestination);
    END_INTERFACE
  } ITargetNotifyVtbl;
  struct ITargetNotify {
    CONST_VTBL struct ITargetNotifyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITargetNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITargetNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITargetNotify_Release(This) (This)->lpVtbl->Release(This)
#define ITargetNotify_OnCreate(This,pUnkDestination,cbCookie) (This)->lpVtbl->OnCreate(This,pUnkDestination,cbCookie)
#define ITargetNotify_OnReuse(This,pUnkDestination) (This)->lpVtbl->OnReuse(This,pUnkDestination)
#endif
#endif
  HRESULT WINAPI ITargetNotify_OnCreate_Proxy(ITargetNotify *This,IUnknown *pUnkDestination,ULONG cbCookie);
  void __RPC_STUB ITargetNotify_OnCreate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetNotify_OnReuse_Proxy(ITargetNotify *This,IUnknown *pUnkDestination);
  void __RPC_STUB ITargetNotify_OnReuse_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ITargetNotify2_INTERFACE_DEFINED__
#define __ITargetNotify2_INTERFACE_DEFINED__
  typedef ITargetNotify2 *LPTARGETNOTIFY2;

  EXTERN_C const IID IID_ITargetNotify2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITargetNotify2 : public ITargetNotify {
  public:
    virtual HRESULT WINAPI GetOptionString(BSTR *pbstrOptions) = 0;
  };
#else
  typedef struct ITargetNotify2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITargetNotify2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITargetNotify2 *This);
      ULONG (WINAPI *Release)(ITargetNotify2 *This);
      HRESULT (WINAPI *OnCreate)(ITargetNotify2 *This,IUnknown *pUnkDestination,ULONG cbCookie);
      HRESULT (WINAPI *OnReuse)(ITargetNotify2 *This,IUnknown *pUnkDestination);
      HRESULT (WINAPI *GetOptionString)(ITargetNotify2 *This,BSTR *pbstrOptions);
    END_INTERFACE
  } ITargetNotify2Vtbl;
  struct ITargetNotify2 {
    CONST_VTBL struct ITargetNotify2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITargetNotify2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITargetNotify2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITargetNotify2_Release(This) (This)->lpVtbl->Release(This)
#define ITargetNotify2_OnCreate(This,pUnkDestination,cbCookie) (This)->lpVtbl->OnCreate(This,pUnkDestination,cbCookie)
#define ITargetNotify2_OnReuse(This,pUnkDestination) (This)->lpVtbl->OnReuse(This,pUnkDestination)
#define ITargetNotify2_GetOptionString(This,pbstrOptions) (This)->lpVtbl->GetOptionString(This,pbstrOptions)
#endif
#endif
  HRESULT WINAPI ITargetNotify2_GetOptionString_Proxy(ITargetNotify2 *This,BSTR *pbstrOptions);
  void __RPC_STUB ITargetNotify2_GetOptionString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ITargetFrame2_INTERFACE_DEFINED__
#define __ITargetFrame2_INTERFACE_DEFINED__
  typedef ITargetFrame2 *LPTARGETFRAME2;
  typedef
    enum __MIDL_ITargetFrame2_0001 {
      FINDFRAME_NONE = 0,FINDFRAME_JUSTTESTEXISTENCE = 1,FINDFRAME_INTERNAL = 0x80000000
  } FINDFRAME_FLAGS;

  typedef enum __MIDL_ITargetFrame2_0002 {
    FRAMEOPTIONS_SCROLL_YES = 0x1,FRAMEOPTIONS_SCROLL_NO = 0x2,FRAMEOPTIONS_SCROLL_AUTO = 0x4,FRAMEOPTIONS_NORESIZE = 0x8,FRAMEOPTIONS_NO3DBORDER = 0x10,
    FRAMEOPTIONS_DESKTOP = 0x20,FRAMEOPTIONS_BROWSERBAND = 0x40
  } FRAMEOPTIONS_FLAGS;

  EXTERN_C const IID IID_ITargetFrame2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITargetFrame2 : public IUnknown {
  public:
    virtual HRESULT WINAPI SetFrameName(LPCWSTR pszFrameName) = 0;
    virtual HRESULT WINAPI GetFrameName(LPWSTR *ppszFrameName) = 0;
    virtual HRESULT WINAPI GetParentFrame(IUnknown **ppunkParent) = 0;
    virtual HRESULT WINAPI SetFrameSrc(LPCWSTR pszFrameSrc) = 0;
    virtual HRESULT WINAPI GetFrameSrc(LPWSTR *ppszFrameSrc) = 0;
    virtual HRESULT WINAPI GetFramesContainer(IOleContainer **ppContainer) = 0;
    virtual HRESULT WINAPI SetFrameOptions(DWORD dwFlags) = 0;
    virtual HRESULT WINAPI GetFrameOptions(DWORD *pdwFlags) = 0;
    virtual HRESULT WINAPI SetFrameMargins(DWORD dwWidth,DWORD dwHeight) = 0;
    virtual HRESULT WINAPI GetFrameMargins(DWORD *pdwWidth,DWORD *pdwHeight) = 0;
    virtual HRESULT WINAPI FindFrame(LPCWSTR pszTargetName,DWORD dwFlags,IUnknown **ppunkTargetFrame) = 0;
    virtual HRESULT WINAPI GetTargetAlias(LPCWSTR pszTargetName,LPWSTR *ppszTargetAlias) = 0;
  };
#else
  typedef struct ITargetFrame2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITargetFrame2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITargetFrame2 *This);
      ULONG (WINAPI *Release)(ITargetFrame2 *This);
      HRESULT (WINAPI *SetFrameName)(ITargetFrame2 *This,LPCWSTR pszFrameName);
      HRESULT (WINAPI *GetFrameName)(ITargetFrame2 *This,LPWSTR *ppszFrameName);
      HRESULT (WINAPI *GetParentFrame)(ITargetFrame2 *This,IUnknown **ppunkParent);
      HRESULT (WINAPI *SetFrameSrc)(ITargetFrame2 *This,LPCWSTR pszFrameSrc);
      HRESULT (WINAPI *GetFrameSrc)(ITargetFrame2 *This,LPWSTR *ppszFrameSrc);
      HRESULT (WINAPI *GetFramesContainer)(ITargetFrame2 *This,IOleContainer **ppContainer);
      HRESULT (WINAPI *SetFrameOptions)(ITargetFrame2 *This,DWORD dwFlags);
      HRESULT (WINAPI *GetFrameOptions)(ITargetFrame2 *This,DWORD *pdwFlags);
      HRESULT (WINAPI *SetFrameMargins)(ITargetFrame2 *This,DWORD dwWidth,DWORD dwHeight);
      HRESULT (WINAPI *GetFrameMargins)(ITargetFrame2 *This,DWORD *pdwWidth,DWORD *pdwHeight);
      HRESULT (WINAPI *FindFrame)(ITargetFrame2 *This,LPCWSTR pszTargetName,DWORD dwFlags,IUnknown **ppunkTargetFrame);
      HRESULT (WINAPI *GetTargetAlias)(ITargetFrame2 *This,LPCWSTR pszTargetName,LPWSTR *ppszTargetAlias);
    END_INTERFACE
  } ITargetFrame2Vtbl;
  struct ITargetFrame2 {
    CONST_VTBL struct ITargetFrame2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITargetFrame2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITargetFrame2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITargetFrame2_Release(This) (This)->lpVtbl->Release(This)
#define ITargetFrame2_SetFrameName(This,pszFrameName) (This)->lpVtbl->SetFrameName(This,pszFrameName)
#define ITargetFrame2_GetFrameName(This,ppszFrameName) (This)->lpVtbl->GetFrameName(This,ppszFrameName)
#define ITargetFrame2_GetParentFrame(This,ppunkParent) (This)->lpVtbl->GetParentFrame(This,ppunkParent)
#define ITargetFrame2_SetFrameSrc(This,pszFrameSrc) (This)->lpVtbl->SetFrameSrc(This,pszFrameSrc)
#define ITargetFrame2_GetFrameSrc(This,ppszFrameSrc) (This)->lpVtbl->GetFrameSrc(This,ppszFrameSrc)
#define ITargetFrame2_GetFramesContainer(This,ppContainer) (This)->lpVtbl->GetFramesContainer(This,ppContainer)
#define ITargetFrame2_SetFrameOptions(This,dwFlags) (This)->lpVtbl->SetFrameOptions(This,dwFlags)
#define ITargetFrame2_GetFrameOptions(This,pdwFlags) (This)->lpVtbl->GetFrameOptions(This,pdwFlags)
#define ITargetFrame2_SetFrameMargins(This,dwWidth,dwHeight) (This)->lpVtbl->SetFrameMargins(This,dwWidth,dwHeight)
#define ITargetFrame2_GetFrameMargins(This,pdwWidth,pdwHeight) (This)->lpVtbl->GetFrameMargins(This,pdwWidth,pdwHeight)
#define ITargetFrame2_FindFrame(This,pszTargetName,dwFlags,ppunkTargetFrame) (This)->lpVtbl->FindFrame(This,pszTargetName,dwFlags,ppunkTargetFrame)
#define ITargetFrame2_GetTargetAlias(This,pszTargetName,ppszTargetAlias) (This)->lpVtbl->GetTargetAlias(This,pszTargetName,ppszTargetAlias)
#endif
#endif
  HRESULT WINAPI ITargetFrame2_SetFrameName_Proxy(ITargetFrame2 *This,LPCWSTR pszFrameName);
  void __RPC_STUB ITargetFrame2_SetFrameName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_GetFrameName_Proxy(ITargetFrame2 *This,LPWSTR *ppszFrameName);
  void __RPC_STUB ITargetFrame2_GetFrameName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_GetParentFrame_Proxy(ITargetFrame2 *This,IUnknown **ppunkParent);
  void __RPC_STUB ITargetFrame2_GetParentFrame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_SetFrameSrc_Proxy(ITargetFrame2 *This,LPCWSTR pszFrameSrc);
  void __RPC_STUB ITargetFrame2_SetFrameSrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_GetFrameSrc_Proxy(ITargetFrame2 *This,LPWSTR *ppszFrameSrc);
  void __RPC_STUB ITargetFrame2_GetFrameSrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_GetFramesContainer_Proxy(ITargetFrame2 *This,IOleContainer **ppContainer);
  void __RPC_STUB ITargetFrame2_GetFramesContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_SetFrameOptions_Proxy(ITargetFrame2 *This,DWORD dwFlags);
  void __RPC_STUB ITargetFrame2_SetFrameOptions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_GetFrameOptions_Proxy(ITargetFrame2 *This,DWORD *pdwFlags);
  void __RPC_STUB ITargetFrame2_GetFrameOptions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_SetFrameMargins_Proxy(ITargetFrame2 *This,DWORD dwWidth,DWORD dwHeight);
  void __RPC_STUB ITargetFrame2_SetFrameMargins_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_GetFrameMargins_Proxy(ITargetFrame2 *This,DWORD *pdwWidth,DWORD *pdwHeight);
  void __RPC_STUB ITargetFrame2_GetFrameMargins_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_FindFrame_Proxy(ITargetFrame2 *This,LPCWSTR pszTargetName,DWORD dwFlags,IUnknown **ppunkTargetFrame);
  void __RPC_STUB ITargetFrame2_FindFrame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetFrame2_GetTargetAlias_Proxy(ITargetFrame2 *This,LPCWSTR pszTargetName,LPWSTR *ppszTargetAlias);
  void __RPC_STUB ITargetFrame2_GetTargetAlias_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ITargetContainer_INTERFACE_DEFINED__
#define __ITargetContainer_INTERFACE_DEFINED__
  typedef ITargetContainer *LPTARGETCONTAINER;

  EXTERN_C const IID IID_ITargetContainer;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ITargetContainer : public IUnknown {
  public:
    virtual HRESULT WINAPI GetFrameUrl(LPWSTR *ppszFrameSrc) = 0;
    virtual HRESULT WINAPI GetFramesContainer(IOleContainer **ppContainer) = 0;
  };
#else
  typedef struct ITargetContainerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ITargetContainer *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ITargetContainer *This);
      ULONG (WINAPI *Release)(ITargetContainer *This);
      HRESULT (WINAPI *GetFrameUrl)(ITargetContainer *This,LPWSTR *ppszFrameSrc);
      HRESULT (WINAPI *GetFramesContainer)(ITargetContainer *This,IOleContainer **ppContainer);
    END_INTERFACE
  } ITargetContainerVtbl;
  struct ITargetContainer {
    CONST_VTBL struct ITargetContainerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ITargetContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITargetContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITargetContainer_Release(This) (This)->lpVtbl->Release(This)
#define ITargetContainer_GetFrameUrl(This,ppszFrameSrc) (This)->lpVtbl->GetFrameUrl(This,ppszFrameSrc)
#define ITargetContainer_GetFramesContainer(This,ppContainer) (This)->lpVtbl->GetFramesContainer(This,ppContainer)
#endif
#endif
  HRESULT WINAPI ITargetContainer_GetFrameUrl_Proxy(ITargetContainer *This,LPWSTR *ppszFrameSrc);
  void __RPC_STUB ITargetContainer_GetFrameUrl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ITargetContainer_GetFramesContainer_Proxy(ITargetContainer *This,IOleContainer **ppContainer);
  void __RPC_STUB ITargetContainer_GetFramesContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif

  extern RPC_IF_HANDLE __MIDL_itf_htiframe_0121_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_htiframe_0121_v0_0_s_ifspec;

  unsigned long __RPC_API BSTR_UserSize(unsigned long *,unsigned long,BSTR *);
  unsigned char *__RPC_API BSTR_UserMarshal(unsigned long *,unsigned char *,BSTR *);
  unsigned char *__RPC_API BSTR_UserUnmarshal(unsigned long *,unsigned char *,BSTR *);
  void __RPC_API BSTR_UserFree(unsigned long *,BSTR *);

#ifdef __cplusplus
}
#endif
#endif
