/*
 * Coclasses for shell32
 *
 * Copyright 2011 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("Shell Automation Service"),
    progid("Shell.Application.1"),
    vi_progid("Shell.Application"),
    threading(apartment),
    uuid(13709620-c279-11ce-a49e-444553540000)
]
coclass Shell { interface IShellDispatch; }

[
    helpstring("Printers and Faxes"),
    threading(apartment),
    uuid(2227a280-3aea-1069-a2de-08002b30309d)
]
coclass Printers { interface IShellFolder2; }

[
    helpstring("Explorer Browser"),
    threading(apartment),
    uuid(71f96385-ddd6-48d3-a0c1-ae06e8b055fb)
]
coclass ExplorerBrowser { interface IExplorerBrowser; }

[
    helpstring("Known Folder Manager"),
    threading(apartment),
    uuid(4df0c730-df9d-4ae3-9153-aa6b82e9795a)
]
coclass KnownFolderManager { interface IKnownFolderManager; }

[
    helpstring("Microsoft Shell Folder View Router"),
    threading(apartment),
    uuid(9ba05971-f6a8-11cf-a442-00a0c90a8f39)
] coclass ShellFolderViewOC { }

[
    helpstring("Query file associations"),
    threading(apartment),
    uuid(a07034fd-6caa-4954-ac3f-97a27216f98a)
] coclass QueryAssociations { interface IQueryAssociations; }

[
    helpstring("Manage Application associations"),
    threading(apartment),
    uuid(591209c7-767b-42b2-9fba-44ee4615f2c7)
] coclass ApplicationAssociationRegistration { interface IApplicationAssociationRegistration; }

[
    helpstring("Shell Drag and Drop Helper"),
    threading(apartment),
    uuid(4657278a-411b-11d2-839a-00c04fd918d0)
] coclass DragDropHelper { interface IDropTargetHelper; }

[
    threading(apartment),
    uuid(00bb2763-6a77-11d0-a535-00c04fd7d062)
] coclass AutoComplete { interface IAutoComplete2; }

[
    helpstring("Shell File System Folder"),
    threading(apartment),
    uuid(f3364ba0-65b9-11ce-a9ba-00aa004ae837)
] coclass ShellFSFolder { interface IShellFolder2; }

[
    helpstring("My Network Places"),
    threading(apartment),
    uuid(208d2c60-3aea-1069-a2d7-08002b30309d)
] coclass NetworkPlaces { interface IShellFolder2; }

[
    helpstring("Desktop"),
    threading(apartment),
    uuid(00021400-0000-0000-c000-000000000046)
] coclass ShellDesktop { interface IShellFolder2; }

[
    helpstring("Shortcut"),
    threading(apartment),
    uuid(00021401-0000-0000-c000-000000000046)
] coclass ShellLink { interface IShellLinkW; }

[
    helpstring("My Computer"),
    threading(apartment),
    uuid(20d04fe0-3aea-1069-a2d8-08002b30309d)
] coclass MyComputer { interface IShellFolder2; }

[
    threading(apartment),
    uuid(0afaced1-e828-11d1-9187-b532f1e9575d)
] coclass FolderShortcut { interface IShellFolder2; }

[
    helpstring("/"),
    threading(apartment),
    uuid(cc702eb2-7dc5-11d9-c687-0004238a01cd)
] coclass UnixFolder { interface IShellFolder2; }

[
    helpstring("/"),
    threading(apartment),
    uuid(9d20aae8-0625-44b0-9ca7-71889c2254d9)
] coclass UnixDosFolder { interface IShellFolder2; }

[
    helpstring("My Documents"),
    threading(apartment),
    uuid(450d8fba-ad25-11d0-98a8-0800361b1103)
] coclass MyDocuments { interface IShellFolder2; }

[
    helpstring("Trash"),
    threading(apartment),
    uuid(645ff040-5081-101b-9f08-00aa002f954e)
] coclass RecycleBin { interface IShellFolder2; }

[
    helpstring("Control Panel"),
    threading(apartment),
    uuid(21ec2020-3aea-1069-a2dd-08002b30309d)
] coclass ControlPanel { interface IShellFolder2; }

[
    threading(apartment),
    uuid(53bd6b4e-3780-4693-afc3-7161c2f3ee9c)
] coclass MruLongList { }
