/*
 * Typelib for hhctrl
 *
 * 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
 */

import "unknwn.idl";
import "objidl.idl";
import "oaidl.idl";

[
    helpstring("HHCtrl 4.0 Type Library"),
    version(4.0),
    uuid(adb880a2-d8ff-11cf-9377-00aa003b7a11)
]
library HHCTRLLib
{
    importlib("stdole2.tlb");

    [
        helpstring("IHHCtrl Interface"),
        odl,
        dual,
        oleautomation,
        uuid(adb880a1-d8ff-11cf-9377-00aa003b7a11)
    ]
    interface IHHCtrl : IDispatch
    {
      /* FIXME */
    }

    [
        helpstring("Event interface for HHCtrl"),
        uuid(adb880a3-d8ff-11cf-9377-00aa003b7a11)
    ]
    dispinterface _HHCtrlEvents
    {
        properties:
        methods:
            [id(0)] void Click(BSTR ParamString);
    }

    [
        helpstring("HHCtrl Object"),
        progid("Internet.HHCtrl.1"),
        vi_progid("Internet.HHCtrl"),
        threading(apartment),
        version(1.0),
        uuid(adb880a6-d8ff-11cf-9377-00aa003b7a11)
    ]
    coclass OldHHCtrl1
    {
        [default] interface  IHHCtrl;
        [default, source] dispinterface  _HHCtrlEvents;
    }

    [
        helpstring("HHCtrl Object"),
        progid("Internet.HHCtrl.1"),
        vi_progid("Internet.HHCtrl"),
        threading(apartment),
        version(1.0),
        uuid(41b23c28-488e-4e5c-ace2-bb0bbabe99e8)
    ]
    coclass OldHHCtrl2
    {
        [default] interface IHHCtrl;
        [default, source] dispinterface _HHCtrlEvents;
    }

    [
        helpstring("HHCtrl Object"),
        progid("Internet.HHCtrl.1"),
        vi_progid("Internet.HHCtrl"),
        threading(apartment),
        version(1.0),
        uuid(52a2aaae-085d-4187-97ea-8c30db990436)
    ]
    coclass HHCtrl
    {
        [default] interface IHHCtrl;
        [default, source] dispinterface _HHCtrlEvents;
    }
}
