/*
 * COM Classes for dpnet
 *
 * Copyright 2010 Alexandre Julliard
 *
 * 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
 */

[
    helpstring("DirectPlay8Client Object"),
    threading(both),
    uuid(743f1dc6-5aba-429f-8bdf-c54d03253dc2)
]
coclass DirectPlay8Client { interface IDirectPlay8Client; }

[
    helpstring("DirectPlay8Server Object"),
    threading(both),
    uuid(da825e1b-6830-43d7-835d-0b5ad82956a2)
]
coclass DirectPlay8Server { interface IDirectPlay8Server; }

[
    helpstring("DirectPlay8Peer Object"),
    threading(both),
    uuid(286f484d-375e-4458-a272-b138e2f80a6a)
]
coclass DirectPlay8Peer { interface IDirectPlay8Peer; }

[
    helpstring("DirectPlay8Address Object"),
    threading(both),
    uuid(934a9523-a3ca-4bc5-ada0-d6d95d979421)
]
coclass DirectPlay8Address { interface IDirectPlay8Address; }

[
    helpstring("DirectPlay8LobbiedApplication Object"),
    threading(both),
    uuid(667955ad-6b3b-43ca-b949-bc69b5baff7f)
]
coclass DirectPlay8LobbiedApplication { interface IDirectPlay8LobbiedApplication; }

[
    helpstring("DirectPlay8 Thread Pool Object"),
    threading(both),
    uuid(fc47060e-6153-4b34-b975-8e4121eb7f3c)
]
coclass DirectPlay8ThreadPool { interface IDirectPlay8ThreadPool; }
