/*
 * Copyright 2007 Google (Dan Hipschman)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

/* The header file generated from this includes rpc.h, which ends up
   including objidl.h at some point.  This will cause all sorts of errors
   so the easiest thing to do is just comment out our entire header.  */

cpp_quote("#if 0    /* ole32_objidl.idl hack */")
#include "objidl.idl"
cpp_quote("#endif   /* ole32_objidl.idl hack */")

[
    threading(both),
    uuid(00000300-0000-0000-c000-000000000046)
]
coclass StdOleLink { interface IMarshal; }

[
    threading(both),
    progid("file"),
    uuid(00000303-0000-0000-c000-000000000046)
]
coclass FileMoniker { interface IMoniker; }

[
    threading(both),
    uuid(00000304-0000-0000-c000-000000000046)
]
coclass ItemMoniker { interface IMoniker; }

[
    threading(both),
    uuid(00000305-0000-0000-c000-000000000046)
]
coclass AntiMoniker { interface IMoniker; }

[
    threading(both),
    uuid(00000306-0000-0000-c000-000000000046)
]
coclass PointerMoniker { interface IMoniker; }

[
    threading(both),
    uuid(00000308-0000-0000-c000-000000000046)
]
coclass PackagerMoniker { interface IMoniker; }

[
    threading(both),
    uuid(00000309-0000-0000-c000-000000000046)
]
coclass CompositeMoniker { interface IMoniker; }

[
    threading(both),
    uuid(0000030b-0000-0000-c000-000000000046)
]
coclass DfMarshal { interface IMarshal; }

[
    helpstring("Picture (Metafile)"),
    threading(both),
    progid("StaticMetafile"),
    uuid(00000315-0000-0000-c000-000000000046)
]
coclass Picture_Metafile { interface IPicture; }

[
    helpstring("Picture (Device Independent Bitmap)"),
    threading(both),
    progid("StaticDib"),
    uuid(00000316-0000-0000-c000-000000000046)
]
coclass Picture_Dib { interface IPicture; }

[
    threading(both),
    progid("CLSID"),
    uuid(0000031a-0000-0000-c000-000000000046)
]
coclass ClassMoniker { interface IMoniker; }

[
    threading(apartment),
    uuid(00000323-0000-0000-c000-000000000046)
]
coclass StdGlobalInterfaceTable { interface IGlobalInterfaceTable; }

[
    helpstring("Component Categories Manager"),
    threading(both),
    uuid(0002e005-0000-0000-c000-000000000046)
]
coclass StdComponentCategoriesMgr { interface ICatRegister; interface ICatInformation; }
