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

#pragma makedep register

[
    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("DirectPlay8LobbyClient Object"),
    threading(both),
    progid("DirectPlay8Lobby.LobbyClient.1"),
    vi_progid("DirectPlay8Lobby.LobbyClient"),
    uuid(3b2b6775-70b6-45af-8dea-a209c69559f3)
]
coclass DirectPlay8LobbyClient { interface IDirectPlay8LobbyClient; }

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