/*
 * 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(both),
    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("Application Destination List"),
    threading(apartment),
    uuid(86c14003-4d6b-4ef3-a7b4-0506663b2e68)
] coclass ApplicationDestinations { interface IApplicationDestinations; }

[
    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(both),
    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 { }

[
    helpstring("Custom Destination List"),
    threading(apartment),
    uuid(77f10cf0-3db5-4966-b520-b7c54fd35ed6)
] coclass DestinationList { interface ICustomDestinationList; }

[
    helpstring("Shell Image Data Factory"),
    threading(apartment),
    uuid(66e4e4fb-f385-4dd0-8d74-a2efd1bc6178)
] coclass ShellImageDataFactory { interface IShellImageDataFactory; }
