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

[
    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 { }
