/* Automated generated idl file <stdole>.
 * Generated by genidl tool (c) 2009, 2010 Mingw-w64 project.
 */

/* Interface forward declarations.  */
interface IUnknown;
interface IDispatch;
interface IEnumVARIANT;
interface IFont;
interface IPicture;

/* Structure forward declarations.  */
struct GUID;
struct DISPPARAMS;
struct EXCEPINFO;

/* Union record forward declarations.  */
dispinterface Font;
dispinterface Picture;
dispinterface FontEvents;

/* Union record forward declarations.  */
coclass StdFont;
coclass StdPicture;

/* Enumeration declarations.  */
[
  uuid(6650430A-BE0F-101A-8BBB-00AA00300CAB)
]
enum OLE_TRISTATE
{
  Unchecked = (int) 201326592,
  Checked = (int) 201326593,
  Gray = (int) 201326594
};
[
  uuid(E6C8FA08-BD9F-11D0-985E-00C04FC29993)
]
enum LoadPictureConstants
{
  Default = (int) 201326592,
  Monochrome = (int) 201326593,
  VgaColor = (int) 201326594,
  Color = (int) 201326596
};

/* Structure/union declarations.  */
[
  hidden
]
struct GUID
{
  UINT Data1;
  USHORT Data2;
  USHORT Data3;
  UCHAR Data4[8];
};
[
  restricted
]
struct DISPPARAMS
{
  VARIANT *rgvarg;
  long *rgdispidNamedArgs;
  unsigned int cArgs;
  unsigned int cNamedArgs;
};
[
  restricted
]
struct EXCEPINFO
{
  USHORT wCode;
  USHORT wReserved;
  BSTR bstrSource;
  BSTR bstrDescription;
  BSTR bstrHelpFile;
  UINT dwHelpContext;
  void *pvReserved;
  void *pfnDeferredFillIn;
  SCODE scode;
};

/* Type definitions.  */
[
  uuid(66504301-BE0F-101A-8BBB-00AA00300CAB)
]
typedef UINT OLE_COLOR;
[
  uuid(66504302-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef long OLE_XPOS_PIXELS;
[
  uuid(66504303-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef long OLE_YPOS_PIXELS;
[
  uuid(66504304-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef long OLE_XSIZE_PIXELS;
[
  uuid(66504305-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef long OLE_YSIZE_PIXELS;
[
  uuid(66504306-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef long OLE_XPOS_HIMETRIC;
[
  uuid(66504307-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef long OLE_YPOS_HIMETRIC;
[
  uuid(66504308-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef long OLE_XSIZE_HIMETRIC;
[
  uuid(66504309-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef long OLE_YSIZE_HIMETRIC;
[
  uuid(BF030640-9069-101B-AE2D-08002B2EC713),
  hidden
]
typedef float OLE_XPOS_CONTAINER;
[
  uuid(BF030641-9069-101B-AE2D-08002B2EC713),
  hidden
]
typedef float OLE_YPOS_CONTAINER;
[
  uuid(BF030642-9069-101B-AE2D-08002B2EC713),
  hidden
]
typedef float OLE_XSIZE_CONTAINER;
[
  uuid(BF030643-9069-101B-AE2D-08002B2EC713),
  hidden
]
typedef float OLE_YSIZE_CONTAINER;
[
  uuid(66504313-BE0F-101A-8BBB-00AA00300CAB)
]
typedef int OLE_HANDLE;
[
  uuid(6650430B-BE0F-101A-8BBB-00AA00300CAB)
]
typedef WINBOOL OLE_OPTEXCLUSIVE;
[
  uuid(BF030644-9069-101B-AE2D-08002B2EC713)
]
typedef WINBOOL OLE_CANCELBOOL;
[
  uuid(BF030645-9069-101B-AE2D-08002B2EC713),
  hidden
]
typedef WINBOOL OLE_ENABLEDEFAULTBOOL;
[
  uuid(6650430D-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef BSTR FONTNAME;
[
  uuid(6650430E-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef CY FONTSIZE;
[
  uuid(6650430F-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef WINBOOL FONTBOLD;
[
  uuid(66504310-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef WINBOOL FONTITALIC;
[
  uuid(66504311-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef WINBOOL FONTUNDERSCORE;
[
  uuid(66504312-BE0F-101A-8BBB-00AA00300CAB),
  hidden
]
typedef WINBOOL FONTSTRIKETHROUGH;
typedef dispinterface Font IFontDisp;
typedef dispinterface Picture IPictureDisp;
typedef dispinterface FontEvents IFontEventsDisp;

[
  uuid(00020430-0000-0000-C000-000000000046),
  version(2.0),
  helpstring("OLE Automation")
]
library stdole
{
   /* CoClass declarations.  */
   [
     uuid(0BE35203-8F91-11CE-9DE3-00AA004BB851),
     cancreate
   ]
   coclass StdFont
   {
     dispinterface Font;
     dispinterface FontEvents;
     interface IFont;
   };
   [
     uuid(0BE35204-8F91-11CE-9DE3-00AA004BB851),
     cancreate
   ]
   coclass StdPicture
   {
     dispinterface Picture;
     interface IPicture;
   };

   /* Dispatch interface declarations.  */
   [
     uuid(BEF6E003-A874-101A-8BBA-00AA00300CAB),
     dispatchable
   ]
   dispinterface Font
   {
     [id(0)]
     BSTR Name;
     [id(2)]
     CY Size;
     WINBOOL Bold;
     WINBOOL Italic;
     WINBOOL Underline;
     WINBOOL Strikethrough;
     short Weight;
     short Charset;
   };
   [
     uuid(7BF80981-BF32-101A-8BBB-00AA00300CAB),
     dispatchable
   ]
   dispinterface Picture
   {
     [id(6)]
     void __stdcall Render (
       int hdc,
       long x,
       long y,
       long cx,
       long cy,
       OLE_XPOS_HIMETRIC xSrc,
       OLE_YPOS_HIMETRIC ySrc,
       OLE_XSIZE_HIMETRIC cxSrc,
       OLE_YSIZE_HIMETRIC cySrc,
       void *prcWBounds
     );
     [id(0), readonly]
     OLE_HANDLE Handle;
     [id(2)]
     OLE_HANDLE hPal;
     [readonly]
     short Type;
     [readonly]
     OLE_XSIZE_HIMETRIC Width;
     [readonly]
     OLE_YSIZE_HIMETRIC Height;
   };
   [
     uuid(4EF6100A-AF88-11D0-9846-00C04FC29993),
     helpstring("Event interface for the Font object"),
     hidden,
     dispatchable
   ]
   dispinterface FontEvents
   {
     [id(9)]
     void __stdcall FontChanged (
       [in] BSTR PropertyName
     );
   };

};

/* Interface declarations.  */
[
  uuid(00000000-0000-0000-C000-000000000046),
  hidden
]
interface IUnknown
{
  [id(1610612736), restricted]
  HRESULT __stdcall QueryInterface (
    [in] struct GUID *riid,
    [out] void *ppvObj
  );
  [restricted]
  UINT __stdcall AddRef (void);
  [restricted]
  UINT __stdcall Release (void);
};
[
  uuid(00020400-0000-0000-C000-000000000046),
  restricted
]
interface IDispatch : IUnknown
{
  [id(1610678272), restricted]
  HRESULT __stdcall GetTypeInfoCount (
    [out] unsigned int *pctinfo
  );
  [restricted]
  HRESULT __stdcall GetTypeInfo (
    [in] unsigned int itinfo,
    [in] UINT lcid,
    [out] void *pptinfo
  );
  [restricted]
  HRESULT __stdcall GetIDsOfNames (
    [in] struct GUID *riid,
    [in] CHAR *rgszNames,
    [in] unsigned int cNames,
    [in] UINT lcid,
    [out] long *rgdispid
  );
  [restricted]
  HRESULT __stdcall Invoke (
    [in] long dispidMember,
    [in] struct GUID *riid,
    [in] UINT lcid,
    [in] USHORT wFlags,
    [in] struct DISPPARAMS *pdispparams,
    [out] VARIANT *pvarResult,
    [out] struct EXCEPINFO *pexcepinfo,
    [out] unsigned int *puArgErr
  );
};
[
  uuid(00020404-0000-0000-C000-000000000046),
  hidden
]
interface IEnumVARIANT : IUnknown
{
  [id(1610678272)]
  HRESULT __stdcall Next (
    [in] UINT celt,
    [in] VARIANT *rgvar,
    [out] UINT *pceltFetched
  );
  HRESULT __stdcall Skip (
    [in] UINT celt
  );
  HRESULT __stdcall Reset (void);
  HRESULT __stdcall Clone (
    [out] interface IEnumVARIANT **ppenum
  );
};
[
  uuid(BEF6E002-A874-101A-8BBA-00AA00300CAB),
  helpstring("Font Object"),
  hidden
]
interface IFont : IUnknown
{
  [id(1610678272), propget]
  HRESULT __stdcall Name (
    [out retval] BSTR *pname
  );
  [id(1610678272), propput]
  HRESULT __stdcall Name (
    [in] BSTR argNo1
  );
  [id(1610678274), propget]
  HRESULT __stdcall Size (
    [out retval] CY *psize
  );
  [id(1610678274), propput]
  HRESULT __stdcall Size (
    [in] CY argNo1
  );
  [id(1610678276), propget]
  HRESULT __stdcall Bold (
    [out retval] WINBOOL *pbold
  );
  [id(1610678276), propput]
  HRESULT __stdcall Bold (
    [in] WINBOOL argNo1
  );
  [id(1610678278), propget]
  HRESULT __stdcall Italic (
    [out retval] WINBOOL *pitalic
  );
  [id(1610678278), propput]
  HRESULT __stdcall Italic (
    [in] WINBOOL argNo1
  );
  [id(1610678280), propget]
  HRESULT __stdcall Underline (
    [out retval] WINBOOL *punderline
  );
  [id(1610678280), propput]
  HRESULT __stdcall Underline (
    [in] WINBOOL argNo1
  );
  [id(1610678282), propget]
  HRESULT __stdcall Strikethrough (
    [out retval] WINBOOL *pstrikethrough
  );
  [id(1610678282), propput]
  HRESULT __stdcall Strikethrough (
    [in] WINBOOL argNo1
  );
  [id(1610678284), propget]
  HRESULT __stdcall Weight (
    [out retval] short *pweight
  );
  [id(1610678284), propput]
  HRESULT __stdcall Weight (
    [in] short argNo1
  );
  [id(1610678286), propget]
  HRESULT __stdcall Charset (
    [out retval] short *pcharset
  );
  [id(1610678286), propput]
  HRESULT __stdcall Charset (
    [in] short argNo1
  );
  [id(1610678288), propget]
  HRESULT __stdcall hFont (
    [out retval] OLE_HANDLE *phfont
  );
  HRESULT __stdcall Clone (
    [out] interface IFont **ppfont
  );
  HRESULT __stdcall IsEqual (
    [in] interface IFont *pfontOther
  );
  HRESULT __stdcall SetRatio (
    [in] long cyLogical,
    [in] long cyHimetric
  );
  HRESULT __stdcall AddRefHfont (
    [in] OLE_HANDLE hFont
  );
  HRESULT __stdcall ReleaseHfont (
    [in] OLE_HANDLE hFont
  );
};
[
  uuid(7BF80980-BF32-101A-8BBB-00AA00300CAB),
  helpstring("Picture Object"),
  hidden
]
interface IPicture : IUnknown
{
  [id(1610678272), propget]
  HRESULT __stdcall Handle (
    [out retval] OLE_HANDLE *phandle
  );
  [propget]
  HRESULT __stdcall hPal (
    [out retval] OLE_HANDLE *phpal
  );
  [propget]
  HRESULT __stdcall Type (
    [out retval] short *ptype
  );
  [propget]
  HRESULT __stdcall Width (
    [out retval] OLE_XSIZE_HIMETRIC *pwidth
  );
  [propget]
  HRESULT __stdcall Height (
    [out retval] OLE_YSIZE_HIMETRIC *pheight
  );
  HRESULT __stdcall Render (
    [in] int hdc,
    [in] long x,
    [in] long y,
    [in] long cx,
    [in] long cy,
    [in] OLE_XPOS_HIMETRIC xSrc,
    [in] OLE_YPOS_HIMETRIC ySrc,
    [in] OLE_XSIZE_HIMETRIC cxSrc,
    [in] OLE_YSIZE_HIMETRIC cySrc,
    [in] void *prcWBounds
  );
  [id(1610678273), propput]
  HRESULT __stdcall hPal (
    [in] OLE_HANDLE argNo1
  );
  [id(1610678279), propget]
  HRESULT __stdcall CurDC (
    [out retval] int *phdcOut
  );
  HRESULT __stdcall SelectPicture (
    [in] int hdcIn,
    [out] int *phdcOut,
    [out] OLE_HANDLE *phbmpOut
  );
  [propget]
  HRESULT __stdcall KeepOriginalFormat (
    [out retval] WINBOOL *pfkeep
  );
  [id(1610678281), propput]
  HRESULT __stdcall KeepOriginalFormat (
    [in] WINBOOL argNo1
  );
  [id(1610678283)]
  HRESULT __stdcall PictureChanged (void);
  HRESULT __stdcall SaveAsFile (
    [in] void *pstm,
    [in] WINBOOL fSaveMemCopy,
    [out] long *pcbSize
  );
  [propget]
  HRESULT __stdcall Attributes (
    [out retval] long *pdwAttr
  );
  HRESULT __stdcall SetHdc (
    [in] OLE_HANDLE hdc
  );
};

/* Module declarations.  */
[
  uuid(91209AC0-60F6-11CF-9C5D-00AA00C1489E),
  helpstring("Functions for Standard OLE Objects"),
  dllname("oleaut32.dll")
]
module StdFunctions
{
  [id(1610612736)]
  static HRESULT __stdcall LoadPicture (
    [in opt] VARIANT filename,
    [in opt] int widthDesired = (int) 201326592,
    [in opt] int heightDesired = (int) 201326592,
    [in opt] enum LoadPictureConstants flags = (int) 201326592,
    [out retval] IPictureDisp **retval
  );
  static HRESULT __stdcall SavePicture (
    [in] IPictureDisp *Picture,
    [in] BSTR filename
  );
};

