/*
 * 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.  */

#pragma makedep proxy
#pragma makedep register

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(both),
    uuid(00000320-0000-0000-c000-000000000046)
]
coclass PSFactoryBuffer { interface IFactoryBuffer; }

[
    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; }
