/*
 * COM Classes for dmcompos
 *
 * 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

[
    threading(both),
    progid("Microsoft.DirectMusicChordMap.1"),
    vi_progid("Microsoft.DirectMusicChordMap"),
    uuid(d2ac288f-b39b-11d1-8704-00600893b1bd)
]
coclass DirectMusicChordMap { interface IDirectMusicChordMap; }

[
    threading(both),
    progid("Microsoft.DirectMusicComposer.1"),
    vi_progid("Microsoft.DirectMusicComposer"),
    uuid(d2ac2890-b39b-11d1-8704-00600893b1bd)
]
coclass DirectMusicComposer { interface IDirectMusicComposer; }

[
    threading(both),
    progid("Microsoft.DirectMusicChordMapTrack.1"),
    vi_progid("Microsoft.DirectMusicChordMapTrack"),
    uuid(d2ac2896-b39b-11d1-8704-00600893b1bd)
]
coclass DirectMusicChordMapTrack { interface IDirectMusicChordMapTrack; }

[
    threading(both),
    progid("Microsoft.DirectMusicTemplate.1"),
    vi_progid("Microsoft.DirectMusicTemplate"),
    uuid(d30bcc65-60e8-11d1-a7ce-00a0c913f73c)
]
coclass DirectMusicTemplate { interface IDirectMusicTemplate; }

[
    threading(both),
    progid("Microsoft.DirectMusicSignPostTrack.1"),
    vi_progid("Microsoft.DirectMusicSignPostTrack"),
    uuid(f17e8672-c3b4-11d1-870b-00600893b1bd)
]
coclass DirectMusicSignPostTrack { interface IDirectMusicSignPostTrack; }
