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

#pragma makedep proxy
#pragma makedep register

#include "ocidl.idl"

[
    threading(both),
    uuid(b196b286-bab4-101a-b69c-00aa00341d07)
]
coclass PSFactoryBuffer { interface IFactoryBuffer; }

[
    helpstring("Standard Font"),
    progid("StdFont"),
    threading(both),
    uuid(0be35203-8f91-11ce-9de3-00aa004bb851)
]
coclass StdFont { interface IFont; }

[
    helpstring("Obsolete Font"),
    progid("OldFont"),
    threading(both),
    uuid(46763ee0-cab2-11ce-8c20-00aa0051e5d4)
]
coclass OldFont { interface IFont; }

[
    helpstring("Standard Picture"),
    progid("StdPicture"),
    threading(apartment),
    uuid(0be35204-8f91-11ce-9de3-00aa004bb851)
]
coclass StdPicture { interface IPicture; }

[
    threading(both),
    uuid(00020420-0000-0000-c000-000000000046)
]
coclass PSDispatch { }

[
    threading(both),
    uuid(00020421-0000-0000-c000-000000000046)
]
coclass PSEnumVariant { }

[
    threading(both),
    uuid(00020422-0000-0000-c000-000000000046)
]
coclass PSTypeInfo { }

[
    threading(both),
    uuid(00020423-0000-0000-c000-000000000046)
]
coclass PSTypeLib { }

[
    threading(both),
    uuid(00020424-0000-0000-c000-000000000046)
]
coclass PSOAInterface { }

[
    threading(both),
    uuid(00020425-0000-0000-c000-000000000046)
]
coclass PSTypeComp { }

[
    threading(both),
    uuid(df0b3d60-548f-101b-8e65-08002b2bd119)
]
coclass PSSupportErrorInfo { }

[
    threading(both),
    uuid(0000002f-0000-0000-c000-000000000046)
]
coclass CLSID_RecordInfo { }
